Android知識點之延遲載入:ViewStub的使用
在看關於Android效能優化的文章時候,發現關於ViewStub的使用推薦頗多。ViewStub是一個輕量級的View,它一個看不見的,不佔佈局位置,佔用資源非常小的控制元件。
做一下簡單總結:
一、使用場景
假如某一個View在介面上不是一直都顯示的,只有特定條件下才展示給使用者,或者是執行時動態決定載入哪個View的場景,特別是當這個View比較複雜,
載入會耗費一定的記憶體,採用ViewStub實現是一個比較好的方案。
比如我專案中一個場景,噹噹前處於軌跡記錄狀態的時候在左上角顯示一個View,用於顯示當前的記錄狀態,包括記錄時間、實時計算最大高度,行走距離等等,如果處於非軌跡記錄狀態則不顯示,這個View我便採用ViewStub實現延遲載入,在建立Activity時候判斷當前狀態,確定是否載入本View.
二、優缺點
1)優點:延遲載入,節約記憶體資源。
2)缺點:只能實現一次載入,不能借助它實現控制元件的多次顯示和隱藏切換。
三、與setVisibility的異同
1)一個控制元件即時設定了View.GONE,不可見,仍然佔有資源。而viewStub在inflate()之前並不會建立物件,佔有資源很少。
2)可以對一個物件的可見性進行多次設定setVisibility,控制控制元件的可見與否,而ViewStub只能載入一次,即可以從無到有,但是不能再從有到無,靈活性差一點。
四、使用注意事項
viewstub 只能inflate()一次,再次呼叫時會出現空指標異常,我在使用的時候就遇到這樣的場景,當是是當前Fragment切到其他Fragment後又切回的場景,頁面沒有重複載入,onCreate函式沒有重複呼叫,但是onCreateOptionsMenu重新呼叫,而我寫的viewstub初始化好在這個函式中,於是乎便出現了程式執行異常。後面我在呼叫inflate之前加了一個判空操作,就一切正常了,這屬於投機取巧,簡單的view的顯示隱藏還不如用setVisibility來的方便。
ViewStub stub = (ViewStub)view.findViewById(R.id.viewstub_trackinfo);
if(stub!=null){
stub.inflate();
tvTrackInfo = (TextView)view.findViewById(R.id.tv_trackinfo);
}
參考文章:
http://blog.csdn.net/hitlion2008/article/details/6737537#