生命周期
附上生命周期,幫助下面的學(xué)習(xí)。
何為懶加載
Fragment 的 UI 對用戶可見時才加載數(shù)據(jù)
為什么需要
- 需求要求,我們一般是等數(shù)據(jù)加載完畢之后才會初始化UI,但是可能需求會先讓UI顯示,再加載數(shù)據(jù)
- 與ViewPager搭配使用的時候,ViewPager有緩存機制,比如三個頁面,0,1,2,當(dāng)我們處于1頁面的時候0,2也都會加載好,如果數(shù)據(jù)量較大的話,體驗會很差
實現(xiàn)原理
核心的點是判斷UI的可見,F(xiàn)ragment提供了一個setUserVisibleHint(boolean isVisibleToUser)方法可以用來判斷;
setUserVisibleHint方法
- 單個 Fragment,setUserVisibleHint 是不會被調(diào)用的,只有該 Fragment 在 ViewPager 里才會被調(diào)用
- 執(zhí)行順序:setUserVisibleHint 方法在Fragment的生命周期函數(shù)之前執(zhí)行一次,此時isVisibleToUser是false
,后續(xù)還會執(zhí)行一次,此時isVisibleToUser是true,但是這次的時間是不確定的 。參考官方note說明

image
實現(xiàn)代碼
public class FriendFragment extends Fragment {
private boolean isVisible;
// 標志位,標志已經(jīng)初始化完成,防止空指針的異常
private boolean isViewCreated;
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
super.onCreateView(inflater, container, savedInstanceState);
isViewCreated = true;
View chatView = inflater.inflate(R.layout.activity_tab_friend, container,false);
return chatView;
}
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
Log.e("hhp", "setUserVisibleHint: isVisibleToUser--"+isVisibleToUser+"---isViewCreated---"+isViewCreated );
if (isVisibleToUser && isViewCreated) {
isVisible = true;
lazyLoad();
}else {
isVisible = false;
}
}
private void lazyLoad() {
if (!isVisible || !isViewCreated) {
return;
}
getData();
}
private void getData() {
//加載數(shù)據(jù)
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
if (getUserVisibleHint()) {
getData();
}
}
}
幾點說明
分析兩種情況:
(一)
進來就加載的這個Fragment,此時isVisibleToUser 和isViewCreated 兩個標志位的值如下

image
,無法加載數(shù)據(jù) ,所以需要在onActivityCreated方法中調(diào)用加載數(shù)據(jù)
(二)
進來加載的不是這個Fragment,當(dāng)該Fragment被緩存的時候,調(diào)用onActivityCreated方法getUserVisibleHint()值是false,不調(diào)用getData()方法;同理,isVisibleToUser和isViewCreated也是false,也不會調(diào)用getData()方法;
滑動到該Fragment的時候,onActivityCreated方法不會再次執(zhí)行,isVisibleToUser和isViewCreated都變?yōu)閠rue,調(diào)用getData()方法加載數(shù)據(jù)。
總結(jié)
上述代碼簡單修改就可以封裝成一個BaseFragment類,以上就是本人學(xué)習(xí)懶加載的過程,有任何疑問請留言交流。
參考