我又來了,哈哈。由於項目中用到了懶加載,以前也用過一次,可是原理沒有弄懂只記的大概。 因此特地寫了篇文章,但願能夠加深印象,要是可以幫助不是很瞭解的小夥伴那就更好了。廢話很少少了,進入正題。git
咱們在作項目的時候常常會用到ViewPager+TabLayout做爲頁面切換。而切換的內容就是Fragment。但是有一個問題就是ViewPager爲了節省用戶等待時間,默認的會預加載左右各一個頁面(能夠根據 viewPager.setOffscreenPageLimit(limit)來設定)。 當我打開爲Page1的時候,其實Page0,和Page2。已經生成,而且會執行onAttach->->->onResume期間的方法。若是有大量的操做的話,可能會致使卡頓。所以,有的人會想當我滑動到哪一個頁面的時候,在執行我想要的網絡請求操做。因此纔會有了懶加載!github
要搞懂懶加載,就要弄清楚Fragment的生命週期。這裏爲了方便你們觀察我在這裏傳入一張Fragment的生命週期圖。網絡
1. 當咱們加載Page0的時候:這裏我寫了個Demo,爲了更加方便你們觀察。如圖:ide
第一個執行的不是咱們熟知的onAttach方法。而是setUserVisibleHint方法。這個方法就是懶加載的關鍵。在使用ViewPager生成Fragment的時候會預先調用這個方法,告訴用戶該界面是否可見。以後纔會正常執行到onResume生命週期。由於咱們預加載了page1頁面,因此page1頁面也執行到了onResume方法。spa
2.當滑動到Page1的時候code
Page1已經預加載完畢。執行Page1的setUserVisibleHint方法,而且visible爲true便可見cdn
Page0隱藏。執行Page0的setUserVisibleHint方法,而且visible爲false即不可見blog
Page2預加載。執行Page2的setUserVisibleHint直至onResume方法,而且visible爲false即不可見。生成Page2,爲不可見生命週期
3.當滑動到Page2的時候文檔
Page2已經預加載完畢。執行Page2的setUserVisibleHint方法,而且visible爲true便可見
Page1隱藏。執行Page1的setUserVisibleHint方法,而且visible爲false即不可見
Page3預加載。執行Page3的setUserVisibleHint方法,而且visible爲false即不可見。生成Page3,爲不可見
Page0銷燬。執行onPause->onStop->onDestroyView;
4.Page2的生命週期
經過兩個變量,來判斷是否須要懶加載。具體實現方法以下,固然最好的狀況是各位本身根據Fragment的生命週期去寫。
public abstract class BaseFragment extends Fragment {
//該Fragment是否建立過
private boolean isCreated = false;
//該Fragment是否初始過
private boolean isInit = false;
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (isCreated && isVisibleToUser && !isInit) {
Initialize();
isInit = true;
}
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
isCreated = true;
if (isCreated && getUserVisibleHint() && !isInit) {
Initialize();
isInit = true;
}
}
/**
* 初始化方法
*/
public abstract void Initialize();
@Override
public void onDestroyView() {
super.onDestroyView();
isCreated = false;
isInit = false;
}
}
複製代碼
寫完這篇以後對Fragment的生命週期又有了新的認識。好記性不如爛筆頭,推薦你們本身也動手去寫一寫。才能加深印象。
Demo地址:https://github.com/13046434521/LazyFragment
仍是那句老話,風裏雨裏在這裏等你,喜歡的童鞋點個關注唄。你的關注是我最大的動力。畢竟寫這個也不容易。若是有哪裏不對的請及時指出,但願你們一塊兒進步。
最後來個彩蛋,今天在找生命週期圖時在Google文檔官網看到的!!!別忘了關注一下,哈哈,感謝