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。
总结
以上所述是小编给大家介绍的Android 生命周期架构组件使用方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对ZaLou.Cn网站的支持!