简单地使用 Android 生命周期架构组件

2018-02-11 14:10:48来源:https://juejin.im/post/5a7d53ca5188257a6c68ff08作者:稀土掘金人点击

分享


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 完美协作


最新文章

123

最新摄影

闪念基因

微信扫一扫

第七城市微信公众平台