Android啟動優(yōu)化之延時加載的步驟詳解
前言
在應(yīng)用啟動的時候,為了加快啟動速度,往往需要把一些比較重的操作放到子線程中,或者是延時加載。將任務(wù)放在子線程中是一個比較簡單并且看起來有效的操作,但是呢,也不能太過于依賴子線程,它雖然不會阻塞主線程,但是卻會跟主線程搶占CPU,當(dāng)子線程很多并且任務(wù)很重的時候,也還是會拖慢主線程的,不信你可以打出Systrace看一下。延時加載也是一個比較好的策略,但難點(diǎn)就在于延時多久,這個時間并不好掌控。
下面話不多說了,來一起看看詳細(xì)的介紹吧
IdleHandler
以前一直在想Android為什么不在Activity或者Fragment中提供一個接口,讓我們可以在主線程空閑的時候去執(zhí)行一些操作,后來發(fā)現(xiàn)真的有,但這個接口不是在Activity和Fragment中,而是在MessageQueue中,在MessageQuque的源碼中可以看到這么一個接口:
/** * Callback interface for discovering when a thread is going to block * waiting for more messages. */ public static interface IdleHandler { /** * Called when the message queue has run out of messages and will now * wait for more. Return true to keep your idle handler active, false * to have it removed. This may be called if there are still messages * pending in the queue, but they are all scheduled to be dispatched * after the current time. */ boolean queueIdle(); }
簡單來說,就是當(dāng)MessageQueue中沒有更多的消息的時候就會回調(diào)queueIdle()這個方法,返回true的話,當(dāng)MessageQueue中沒有消息的時候還會繼續(xù)回調(diào)這個方法,返回false則會在執(zhí)行完之后移除掉這個監(jiān)聽。
原理就是這么簡單了,接下來就是動手優(yōu)化代碼了,代碼也很簡單。
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // ... // 拿到主線程的MessageQueue Looper.myQueue().addIdleHandler(new MessageQueue.IdleHandler() { @Override public boolean queueIdle() { // 在這里去處理你想延時加載的東西 delayLoad(); // 最后返回false,后續(xù)不用再監(jiān)聽了。 return false; } }); }
寫起來一點(diǎn)都不難,只是我們需要掌握這么一個知識點(diǎn)而已。這里多說一句,網(wǎng)上很多關(guān)于冷啟動優(yōu)化的文章都說到了ViewPager的懶加載,即等到用戶滑動過去的時候才去加載界面,我們在項(xiàng)目中最開始也是這樣做的,但其實(shí)這樣的體驗(yàn)真的很不好,所以我們利用IdleHandler做了一個延時加載,即不影響主界面的啟動工作,又能在主線程空閑下來的時候立刻去加載出其它的Tab,在性能和體驗(yàn)之間找到一個最好的平衡。
參考資料
你知道android的MessageQueue.IdleHandler嗎?
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關(guān)文章
Android 仿日歷翻頁、仿htc時鐘翻頁、數(shù)字翻頁切換效果
這篇文章主要介紹了Android 仿日歷翻頁、仿htc時鐘翻頁、數(shù)字翻頁切換效果,需要的朋友可以參考下2017-07-07Android DrawerLayout帶有側(cè)滑功能的布局類(1)
這篇文章主要為大家詳細(xì)介紹了Android DrawerLayout帶有側(cè)滑功能的布局類,感興趣的小伙伴們可以參考一下2016-07-07Android獲取手機(jī)聯(lián)系人電話號碼并返回結(jié)果
這篇文章主要為大家詳細(xì)介紹了Android獲取手機(jī)聯(lián)系人電話號碼并返回結(jié)果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-11-11Android?Recyclerview實(shí)現(xiàn)左滑刪除功能
這篇文章主要為大家詳細(xì)介紹了Android?Recyclerview實(shí)現(xiàn)左滑刪除功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-04-04Android Studio項(xiàng)目適配AndroidX(Android 9.0)的方法步驟
這篇文章主要介紹了Android Studio項(xiàng)目適配AndroidX(Android 9.0)的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11Android 給應(yīng)用程序的icon添加未讀消息個數(shù)提示(紅圈內(nèi)數(shù)字)
本文主要介紹了Android 給應(yīng)用程序的icon添加未讀消息個數(shù)提示(紅圈內(nèi)數(shù)字)的方法。具有很好的參考價值。下面跟著小編一起來看下吧2017-04-04