效能優化系列之fragment的懶載入
Fragment的懶載入大概就是這樣,比較簡單。新增幾個標識位判斷是否是第一次可見/不可見、onViewCreated是否執行完(必要,否則setUserVisibleHint在onViewCreated執行完前回調,然後進行懶載入的話可能會導致空指標)。在加入懶載入之後,開啟app時的記憶體佔用能降到70m左右,下降了近20%,對於一些效能較差的使用者還是比較關鍵的。
不過懶載入也有壞處就是使用者第一次進入頁面時需要短暫等待載入。因此是否需要懶載入得根據產品定位、目標人群等來決定,這就是產品經理需要考慮的問題了蛤蛤。 完整的BaseLazyFragment程式碼如下: import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v4.app.Fragment; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; public abstract class BaseLazyFragment extends Fragment { private boolean isFirstVisible = true; private boolean isFirstInvisible = true; private boolean isViewCreated; private boolean isUIVisible; @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { Log.i("LazyLoad", getClass().getName() + "onCreateView"); if (getLayoutId() != 0) { return inflater.inflate(getLayoutId(), container, false); } else { return super.onCreateView(inflater, container, savedInstanceState); } } @Override public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); isViewCreated = true; lazyLoad(); // 執行懶載入,因為無法確定setUserVisibleHint和onViewCreated哪個方法先執行,因此兩個方法裡面都需要呼叫lazyLoad } @Override public void setUserVisibleHint(boolean isVisibleToUser) { super.setUserVisibleHint(isVisibleToUser); if (isVisibleToUser) { isUIVisible = true; //當前fragment可見 if (isFirstVisible) { //如果是第一次可見,則進行懶載入 isFirstVisible = false; lazyLoad(); } else { //不是第一次可見,則呼叫onUserVisible() onUserVisible(); } } else { isUIVisible = false; if (isFirstInvisible) { isFirstInvisible = false; //第一次不可見 onFirstUserInvisible(); } else { //非第一次不可見 onUserInvisible(); } } } private void lazyLoad() { if (isViewCreated && isUIVisible) { //需要進行雙重判斷,避免因為setUserVisibleHint先於onViewCreaetd呼叫時,出現空指標 initViewsAndEvents(); onFirstUserVisible(); //進行初次可見時的載入 } } protected abstract int getLayoutId(); protected abstract void initViewsAndEvents(); protected abstract void onFirstUserVisible(); protected abstract void onUserVisible(); protected abstract void onFirstUserInvisible(); protected abstract void onUserInvisible(); }