Fragment懶加載看見這個標題的時候不少人都會問爲何Fragment要懶加載,或者在哪一種場景須要懶加載?html
帶着這兩個疑問咱們開始往下看。java
一、爲何Fragment要懶加載android
這個緣由有點簡單,就是想在用戶可見的狀況下Fragment才進行一系列的邏輯操做,這樣減小了手機的內存開銷。網絡
二、那種場景須要Fragment要懶加載app
這個能夠說本文中的重點了,就是ViewPager+Fragment聯合使用的時候。有時候在ViewPager的第一頁有不少網絡請求,第二頁也仍是有不少網絡請求。而ViewPager默認狀況(自定義ViewPager不在我說的範圍內)是進行預加載一頁的,意思就是ViewPager的第一頁和第二頁的網絡請求都是同時發起的,這種狀況下咱們手機的內存消耗也多,而網絡很差的時候用戶體驗也不要,因而就想到了Fragment懶加載。ide
上代碼(其實很簡單的):佈局
import android.os.Bundle; import android.support.annotation.IdRes; import android.support.annotation.Nullable; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; public abstract class BaseFragment extends Fragment implements View.OnClickListener { protected View mContentView; /** * 控件是否初始化完成 */ private boolean isViewCreated; /** * 數據是否已加載完畢 */ private boolean isLoadDataCompleted; @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { this.mContentView = inflater.inflate(loadLayoutId(), null); initViews(); bindListener(); isViewCreated = true; return mContentView; } @Override public void setUserVisibleHint(boolean isVisibleToUser) { super.setUserVisibleHint(isVisibleToUser); if (isVisibleToUser && isViewCreated)//只有在用戶可見以及初始化以後才加載數據 lazyLoad(); } /** * Framgnet重組時候也會跳過onCreate,而onAttach和onActivityCreated仍是會被調用 */ @Override public void onActivityCreated(@Nullable Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); if (getUserVisibleHint()) lazyLoad(); } /** * 懶加載的方法 */ protected void lazyLoad() { if (!isLoadDataCompleted) { initData(); processLogic(); isLoadDataCompleted = true; } } /** * 爲Fragment加載佈局 */ protected abstract int loadLayoutId(); /** * 初始化控件 */ protected abstract void initViews(); /** * 初始化數 */ protected abstract void initData(); /** * 爲控件設置監 */ protected void bindListener() { } /** * 邏輯操做,網絡請求 */ protected void processLogic() { } protected <T extends View> T $(@IdRes int viewId) { return (T) mContentView.findViewById(viewId); } protected void bindClickListener(View... views) { for (View view : views) { if (view != null) view.setOnClickListener(this); } } /** * 控件點擊回調 */ protected void onClick(View view, int id) { } @Override public void onClick(View v) { onClick(v, v.getId()); } @Override public void onDestroyView() { isLoadDataCompleted = false;//這裏須要重置狀態,否則加載了以後就沒辦法再從新加載了 super.onDestroyView(); } }
看到這裏,Fragment懶加載也基本結束了,可能我闡述得不是很清楚,你們能夠看看其餘大神們的博客什麼的。this
ViewPager+Fragment取消預加載(延遲加載).net
http://www.2cto.com/kf/201501/368954.htmlcode
Fragment要懶加載