天天看點

Android應用性能優化最佳實踐.2.6 合理的重新整理機制

<b>2.6 合理的重新整理機制</b>

<b></b>

在應用開發的過程中,因為資料的變化,需要重新整理頁面來展示新的資料,但頻繁重新整理會增加資源開銷,并且可能導緻卡頓發生,是以,需要一個合理的重新整理機制來提高整體的ui流暢度。合理的重新整理需要注意以下幾點:

盡量減少重新整理次數。

盡量避免背景有高cpu線程運作。

縮小重新整理區域。

2.6.1 減少重新整理次數

毫無疑問,減少重新整理次數可以減少系統的開銷,在功耗和頁面的性能上可以表現得更優秀,但不重新整理就不能及時讓使用者看到最新的資料,可以從以下幾個方面減少重新整理次數:

1.?控制重新整理頻率

在有些功能上需要頻繁重新整理某個控件(view),比如下載下傳進度條或者播放進度條,沒有必要在資料每次變化時都更新對應的控件,需要注意的是一定不能出現過度重新整理(進度重新整理頻率大于系統顯示的重新整理頻率)的情況。可以通過定時控制重新整理頻率,相同的重新整理隻做一次,比如播放進度條的刻度是100,如果資料變化沒有1%,完全沒有必要重新整理,這樣可以減少ui的重新整理負擔。

2.?避免沒有必要的重新整理

首先需要判斷是否需要重新整理,比如資料沒有變化、需要重新整理的控件(view)不在可見區域,就沒有必要重新整理。但是需要注意,如果一個view從不可見到可見,一定要重新整理一次。

一般來說,在第一片資料(從無到有)和最後一片資料(結束了一個重新整理周期)時,一定要重新整理一次,以保證完整性。

2.6.2 避免背景線程影響

背景線程雖然不會直接影響到主線程的工作,但如果背景線程開銷很大,占用cpu過高,導緻系統gc頻繁和cpu時間片資源緊張,還是有可能會導緻頁面的卡頓。是以在需要迅速重新整理的情況下避免這類線程在高峰工作。比如listview的滾動,如果listview中的item需要下載下傳圖檔顯示,在listview滾動時可以暫停其他ui的操作,示例代碼如下:

    listview.setonscrolllistener(new abslistview.onscrolllistener() {

    @override

    public void onscrollstatechanged(abslistview abslistview, int scrollstate) {

        if (scrollstate == abslistview.onscrolllistener.scroll_state_fling) {

            mimageworker.setpausework(true);

        } else {

            mimageworker.setpausework(false);

        }

    }

});

通過監聽listview的onscrollstatechanged事件,在滾動時暫停圖檔下載下傳線程工作,結束後再開始,可以提高listview的滾動平滑度。

2.6.3 縮小重新整理區域

在以下兩個場景下可以采用局部重新整理的方法來節省更多的資源。

一是在自定義view中。自定義view一般采用invalidata方法重新整理。如果需要更新的資料隻是在某一個區域内改變,在調用invalidata方法更新這個區域時,也會更新整個視圖,這就浪費了不需要更新區域資源。android提供系統了兩個局部更新資料的方法:

invalidate(rect dirty);

invalidate(int left, int top, int right,int bottom);

使用這兩個方法可以隻更新需要更新的區域,其他不需要資料更新的區域不會更新,這樣能節省部分資源。

第二種是容器中的某個item發生了變化,隻需要更新這一個item即可。比如在listview中,如果是單條操作,就必須調用adapter的notifydatasetchanged()重新整理。

繼續閱讀