91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Android啟動優化之延時加載的步驟詳解

發布時間:2020-09-03 05:56:51 來源:腳本之家 閱讀:120 作者:Android雜貨鋪 欄目:移動開發

前言

在應用啟動的時候,為了加快啟動速度,往往需要把一些比較重的操作放到子線程中,或者是延時加載。將任務放在子線程中是一個比較簡單并且看起來有效的操作,但是呢,也不能太過于依賴子線程,它雖然不會阻塞主線程,但是卻會跟主線程搶占CPU,當子線程很多并且任務很重的時候,也還是會拖慢主線程的,不信你可以打出Systrace看一下。延時加載也是一個比較好的策略,但難點就在于延時多久,這個時間并不好掌控。

下面話不多說了,來一起看看詳細的介紹吧

IdleHandler

以前一直在想Android為什么不在Activity或者Fragment中提供一個接口,讓我們可以在主線程空閑的時候去執行一些操作,后來發現真的有,但這個接口不是在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();

}

簡單來說,就是當MessageQueue中沒有更多的消息的時候就會回調queueIdle()這個方法,返回true的話,當MessageQueue中沒有消息的時候還會繼續回調這個方法,返回false則會在執行完之后移除掉這個監聽。

原理就是這么簡單了,接下來就是動手優化代碼了,代碼也很簡單。

@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,后續不用再監聽了。
  return false;
 }
 });
}

寫起來一點都不難,只是我們需要掌握這么一個知識點而已。這里多說一句,網上很多關于冷啟動優化的文章都說到了ViewPager的懶加載,即等到用戶滑動過去的時候才去加載界面,我們在項目中最開始也是這樣做的,但其實這樣的體驗真的很不好,所以我們利用IdleHandler做了一個延時加載,即不影響主界面的啟動工作,又能在主線程空閑下來的時候立刻去加載出其它的Tab,在性能和體驗之間找到一個最好的平衡。

參考資料

你知道android的MessageQueue.IdleHandler嗎?

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對億速云的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

深水埗区| 湘阴县| 交口县| 黎城县| 抚顺市| 宝坻区| 临猗县| 西贡区| 海阳市| 吉木萨尔县| 岑溪市| 伽师县| 永春县| 峨眉山市| 勃利县| 县级市| 太和县| 邵东县| 平塘县| 响水县| 乐清市| 德兴市| 泰州市| 内黄县| 乐安县| 呼伦贝尔市| 米易县| 襄城县| 清流县| 甘德县| 嘉祥县| 无锡市| 大理市| 仙居县| 武定县| 德兴市| 曲松县| 东海县| 名山县| 元氏县| 天长市|