打開一個app的時候速度比較慢,等一會才能看到UI,有很多種原因,下面是我根據這些個情況做出的多種優化,記錄一下。
1、採用動態佈局:
先是優化了佈局,減少層級嵌套,使用merge優化等等。但發現加載xml佈局還是慢了點,於是改爲動態佈局,佈局的時間減少了好幾倍。
2、利用MessageQueue.IdleHandler()回調
按照activity的生命週期,onStart時可以看見頁面,onResume可以獲得焦點,所以就自然而然地以爲在onResume時已經佈局完成,加載數據也沒關係,可是我錯了。因爲onResume先於measure等流程,此時加載數據會導致加載佈局頁面延後,給人一種打開app速度緩慢的感覺,所以如果我們想在界面繪製出來後做點什麼,那麼在onResume裏面顯然是不合適的。(參考:https://blog.csdn.net/tencent_bugly/article/details/78395717)
於是採用下面方式:
Looper.myQueue().addIdleHandler(new MessageQueue.IdleHandler() { @Override public boolean queueIdle() { // 先讀本地緩存來顯示數據 // 延遲拉取網絡最新數據,刷新緩存和UI return false; // false的話只執行一次,true的話會在每次消息隊列爲空時都回調執行。 } });
當MessageQueue消息隊列裏面的message爲空時(大概就是onResume和measure, layout, draw都執行完以後),才執行IdleHandler回調,此時不會阻塞主線程加載佈局,又減少了大約1倍的啓動時間。
3、先加載本地緩存,後從網絡拉取
在app經常做的就是這種“假數據”吧,爲了提高用戶體驗,先加載上次退出前保存的數據,再拉取新的數據覆蓋。
4、從閃屏頁到設置Theme背景,再到設置Window背景,直到放棄
首先,可以弄一個閃屏頁,就能在打開app時很快看到UI,當然這不是我的需求。其次呢,可以通過設置Theme的背景,很快看到UI,在activity上應用如下這種style。
<style name="XDAppTheme" parent="AppTheme"> <item name="android:windowBackground">圖片</item> <item name="android:windowIsTranslucent">false</item> </style>
可是,這種方式有個缺點,不能動態改變圖片,不符合我的需求。最後,這種設置背景的方式並不能滿足我的需求,勉強加載個背景圖片充充數吧(可能減少個幾毫秒時間o(╥﹏╥)o),在super.onCreate(savedInstanceState);前設置背景:getWindow().setBackgroundDrawableResource(圖片資源);
5、加載數據不要放在主線程
偶然發現,有時候加載比較慢,有時候加載比較快,爲神馬?於是找找找,原來某處妖孽縱橫,此起彼伏,佔用了我的主線程,果斷放在io線程,提升了大約300ms,哇,滿面春風,得意洋洋,打完收工,下期再會~