activity啓動卡頓問題

切換頁面卡斷問題
一、問題:
        由於項目需求經常變動,使用Activity包含Fragment來實現,在Activity的onCreate中創建加載Fragment。這種實現在性能差的手機上,啓動新頁面切換緩慢,經常出現用戶點擊按鈕後,2-3s後纔出現新頁面。

二、分析:
      使用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中做耗時操作!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章