Support Library 26.1+ 直接支持生命周期架构组件使用该组件, Android 生命周期的梦魇已经成为过去再也不用担心出现 Can not perform this action after onSaveInstanceState 这样的异常了
笔者封装了一个简化使用该组件的辅助类, 大约 70 行代码:
- public class LifecycleDelegate implements LifecycleObserver {
- private LinkedList < Runnable > tasks = new LinkedList < >();
- private final LifecycleOwner lifecycleOwner;
- public LifecycleDelegate(LifecycleOwner lifecycleOwner) {
- this.lifecycleOwner = lifecycleOwner;
- lifecycleOwner.getLifecycle().addObserver(this);
- }
- public void scheduleTaskAtStarted(Runnable runnable) {
- if (getLifecycle().getCurrentState() != Lifecycle.State.DESTROYED) {
- assertMainThread();
- tasks.add(runnable);
- considerExecute();
- }
- }@OnLifecycleEvent(Lifecycle.Event.ON_ANY) void onStateChange() {
- if (getLifecycle().getCurrentState() == Lifecycle.State.DESTROYED) {
- tasks.clear();
- getLifecycle().removeObserver(this);
- } else {
- considerExecute();
- }
- }
- void considerExecute() {
- if (isAtLeastStarted()) {
- for (Runnable task: tasks) {
- task.run();
- }
- tasks.clear();
- }
- }
- boolean isAtLeastStarted() {
- return getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.STARTED);
- }
- private Lifecycle getLifecycle() {
- return lifecycleOwner.getLifecycle();
- }
- private void assertMainThread() {
- if (!isMainThread()) {
- throw new IllegalStateException("you should perform the task at main thread.");
- }
- }
- static boolean isMainThread() {
- return Looper.getMainLooper().getThread() == Thread.currentThread();
- }
- }
在 Activity 或 Fragment 中这样使用
private LifecycleDelegate lifecycleDelegate = new LifecycleDelegate(this);
然后在适当的时机调用
lifecycleDelegate.scheduleTaskAtStarted
该辅助类会检查是否在主线程调用, 以确保线程安全以及在主线程更新 UI
如果你使用 RxJava, 可以参考下文的做法:
Android 生命周期架构组件与 RxJava 完美协作
来源: https://juejin.im/post/5a7d53ca5188257a6c68ff08