二、分析:
使用TraceView發現,在性能差的手機上,Fragment的創建添加操作需要耗時0.6s;考慮當前是在Activity的onCreate中執行Fragment的創建添加操作。由於Fragment的創建添加操作是發生在UI線程中(屬於順序執行),同時Activity執行完onStart後,頁面才顯示出來(onCreate後)。那麼如果將Fragment的創建添加放在onStart後面,onCreate的執行時間就會短些,這樣應該能做到接受到用戶點擊事件後,新頁面展現得早些。
三、實踐:
1.首先,在onCreate中,將Fragment的創建添加通過handler延時執行50ms,測試發現,用戶點擊後,頁面“幾乎”立即跳轉,除去Fragment的部分全部展示,但需要一段時間,Fragment才加載出來。
這樣可以得出結論:Fragment晚些創建,確實有助於頁面快速跳轉。
2.接着,將延時時間改爲10ms,發現跟未加延時幾乎相同,點擊後都要過2-3s才顯示新頁面。
創建加載Fragment的創建添加時間點是不好把握的,因爲有的手機性能好,Activity顯示出來所需時間比較短;有的手機性能差,Activity顯示出來所需時間長。同時因爲Handler插入的到Message隊列中,都是在UI線程中執行,無法保證確實在延時指定時間就執行,這樣在同一臺手機上,同一個時間延遲,顯示的效果也是不一致的。
考慮下,如果Activity顯示出來後,能發個消息讓從而執行Fragment創建加載操作,這樣就可以規避以上問題。
百度下View加載完成時的回調
//view加載完成時回調
view.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
// TODO Auto-generated method stub
}
});
使用這種方式,調用Handler.post()來加載Fragment,問題基本解決。
之後看Gracker的方法,基本思路相同,但分析得很透徹。他使用的方式是:
getWindow().getDecorView().post(new Runnable() {
@Override
publicvoidrun(){
myHandler.post(mLoadingRunnable);
}
});
Gracker的文章 Android應用啓動優化:一種DelayLoad的實現和原理(上篇)
這個事情告訴我們,不要在onCreate、onStart、onResume中做耗時操作!