Android 生命周期架构组件使用方法

时间:2021-05-21

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

声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。

相关文章