Android 生命周期架構(gòu)組件使用方法
Support Library 26.1+ 直接支持生命周期架構(gòu)組件。使用該組件,Android 生命周期的夢(mèng)魘已經(jīng)成為過(guò)去。再也不用擔(dān)心出現(xiàn) Can not perform this action after onSaveInstanceState 這樣的異常了。
筆者封裝了一個(gè)簡(jiǎn)化使用該組件的輔助類(lèi),大約 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);
然后在適當(dāng)?shù)臅r(shí)機(jī)調(diào)用 lifecycleDelegate.scheduleTaskAtStarted
該輔助類(lèi)會(huì)檢查是否在主線程調(diào)用,以確保線程安全以及在主線程更新 UI。
總結(jié)
以上所述是小編給大家介紹的Android 生命周期架構(gòu)組件使用方法,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
- Android Jetpack架構(gòu)組件Lifecycle詳解
- Android Jetpack架構(gòu)組件 ViewModel詳解
- Android架構(gòu)組件Room的使用詳解
- Android架構(gòu)組件Room指南
- Android-ViewModel和LiveData使用詳解
- Android LiveData使用需要注意的地方
- Android mvvm之LiveData原理案例詳解
- Android 基于MediatorLiveData實(shí)現(xiàn)紅點(diǎn)的統(tǒng)一管理
- 詳解Android JetPack之LiveData的工作原理
- Android架構(gòu)組件LiveData使用詳解
相關(guān)文章
Android使用URL讀取網(wǎng)絡(luò)資源的方法
這篇文章主要為大家詳細(xì)介紹了Android使用URL讀取網(wǎng)絡(luò)資源的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-10-10Android內(nèi)部存儲(chǔ)改變讀取權(quán)限的方法
今天小編就為大家分享一篇Android內(nèi)部存儲(chǔ)改變讀取權(quán)限的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-08-08Kotlin類(lèi)對(duì)象class初始化與使用
Kotlin 是一種追求簡(jiǎn)潔的語(yǔ)言,在類(lèi)上也下了不少功夫,放棄了很多c++ 中類(lèi)非常復(fù)雜的概念,其實(shí)對(duì)于類(lèi)可以這樣來(lái)理解,為了復(fù)用的方便性和完整性,我們把變量和函數(shù)組合在一起,形成了類(lèi)的概念2022-12-12玩轉(zhuǎn)AppBarLayout實(shí)現(xiàn)更酷炫的頂部欄
玩轉(zhuǎn)AppBarLayout,實(shí)現(xiàn)更酷炫的頂部欄,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-09-09Android高級(jí)xml布局之輸入框EditText設(shè)計(jì)
這篇文章主要為大家詳細(xì)介紹了Android高級(jí)xml布局之輸入框EditText設(shè)計(jì),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-12-12Android編程實(shí)現(xiàn)屏幕自適應(yīng)方向尺寸與分辨率的方法
這篇文章主要介紹了Android編程實(shí)現(xiàn)屏幕自適應(yīng)方向尺寸與分辨率的方法,涉及Android屏幕分辨率、布局、橫豎屏切換等相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-12-12Android使用Jetpack Compose開(kāi)發(fā)零基礎(chǔ)起步教程
Jetpack Compose是用于構(gòu)建原生Android UI的現(xiàn)代工具包。Jetpack Compose使用更少的代碼,強(qiáng)大的工具和直觀的Kotlin API,簡(jiǎn)化并加速了Android上的UI開(kāi)發(fā)2023-04-04Android編程滑動(dòng)效果之倒影效果實(shí)現(xiàn)方法(附demo源碼下載)
這篇文章主要介紹了Android編程滑動(dòng)效果之倒影效果實(shí)現(xiàn)方法,基于繼承BaseAdapter自定義Gallery和ImageAdapter實(shí)現(xiàn)倒影的功能,并附帶demo源碼供讀者下載參考,需要的朋友可以參考下2016-02-02