Android啟動(dòng)優(yōu)化之延時(shí)加載的步驟詳解
前言
在應(yīng)用啟動(dòng)的時(shí)候,為了加快啟動(dòng)速度,往往需要把一些比較重的操作放到子線程中,或者是延時(shí)加載。將任務(wù)放在子線程中是一個(gè)比較簡(jiǎn)單并且看起來有效的操作,但是呢,也不能太過于依賴子線程,它雖然不會(huì)阻塞主線程,但是卻會(huì)跟主線程搶占CPU,當(dāng)子線程很多并且任務(wù)很重的時(shí)候,也還是會(huì)拖慢主線程的,不信你可以打出Systrace看一下。延時(shí)加載也是一個(gè)比較好的策略,但難點(diǎn)就在于延時(shí)多久,這個(gè)時(shí)間并不好掌控。
下面話不多說了,來一起看看詳細(xì)的介紹吧
IdleHandler
以前一直在想Android為什么不在Activity或者Fragment中提供一個(gè)接口,讓我們可以在主線程空閑的時(shí)候去執(zhí)行一些操作,后來發(fā)現(xiàn)真的有,但這個(gè)接口不是在Activity和Fragment中,而是在MessageQueue中,在MessageQuque的源碼中可以看到這么一個(gè)接口:
/**
* 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();
}
簡(jiǎn)單來說,就是當(dāng)MessageQueue中沒有更多的消息的時(shí)候就會(huì)回調(diào)queueIdle()這個(gè)方法,返回true的話,當(dāng)MessageQueue中沒有消息的時(shí)候還會(huì)繼續(xù)回調(diào)這個(gè)方法,返回false則會(huì)在執(zhí)行完之后移除掉這個(gè)監(jiān)聽。
原理就是這么簡(jiǎn)單了,接下來就是動(dòng)手優(yōu)化代碼了,代碼也很簡(jiǎn)單。
@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() {
// 在這里去處理你想延時(shí)加載的東西
delayLoad();
// 最后返回false,后續(xù)不用再監(jiān)聽了。
return false;
}
});
}
寫起來一點(diǎn)都不難,只是我們需要掌握這么一個(gè)知識(shí)點(diǎn)而已。這里多說一句,網(wǎng)上很多關(guān)于冷啟動(dòng)優(yōu)化的文章都說到了ViewPager的懶加載,即等到用戶滑動(dòng)過去的時(shí)候才去加載界面,我們?cè)陧?xiàng)目中最開始也是這樣做的,但其實(shí)這樣的體驗(yàn)真的很不好,所以我們利用IdleHandler做了一個(gè)延時(shí)加載,即不影響主界面的啟動(dòng)工作,又能在主線程空閑下來的時(shí)候立刻去加載出其它的Tab,在性能和體驗(yàn)之間找到一個(gè)最好的平衡。
參考資料
你知道android的MessageQueue.IdleHandler嗎?
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
Android實(shí)現(xiàn)簡(jiǎn)單的音樂播放器
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)簡(jiǎn)單的音樂播放器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05
Android實(shí)現(xiàn)WebView點(diǎn)擊攔截跳轉(zhuǎn)原生
這篇文章主要介紹了Android實(shí)現(xiàn)WebView點(diǎn)擊攔截跳轉(zhuǎn)原生,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-03-03
Android 滑動(dòng)定位和吸附懸停效果實(shí)現(xiàn)代碼
這篇文章主要介紹了Android 滑動(dòng)定位和吸附懸停效果實(shí)現(xiàn)代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-08-08
Android中Activity的四種啟動(dòng)模式和onNewIntent()
android 中activity的啟動(dòng)模式分為四種,(standard、singleTop、singTask、singleInstance),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2018-08-08
Android 中 EventBus 的使用之多線程事件處理
這篇文章主要介紹了Android 中 EventBus 的使用之多線程事件處理的相關(guān)資料,需要的朋友可以參考下2015-11-11
Android 監(jiān)聽Notification 被清除實(shí)例代碼
本文主要介紹Android 監(jiān)聽Notification 事件,這里給大家提供實(shí)例代碼進(jìn)行參考,有需要的小伙伴可以參考下2016-07-07

