小白學(xué)習(xí)Fragment 懶加載

生命周期

附上生命周期,幫助下面的學(xué)習(xí)。

何為懶加載

Fragment 的 UI 對用戶可見時才加載數(shù)據(jù)

為什么需要

  1. 需求要求,我們一般是等數(shù)據(jù)加載完畢之后才會初始化UI,但是可能需求會先讓UI顯示,再加載數(shù)據(jù)
  2. 與ViewPager搭配使用的時候,ViewPager有緩存機制,比如三個頁面,0,1,2,當(dāng)我們處于1頁面的時候0,2也都會加載好,如果數(shù)據(jù)量較大的話,體驗會很差

實現(xiàn)原理

核心的點是判斷UI的可見,F(xiàn)ragment提供了一個setUserVisibleHint(boolean isVisibleToUser)方法可以用來判斷;

setUserVisibleHint方法

  1. 單個 Fragment,setUserVisibleHint 是不會被調(diào)用的,只有該 Fragment 在 ViewPager 里才會被調(diào)用
  2. 執(zhí)行順序:setUserVisibleHint 方法在Fragment的生命周期函數(shù)之前執(zhí)行一次,此時isVisibleToUser是false

,后續(xù)還會執(zhí)行一次,此時isVisibleToUser是true,但是這次的時間是不確定的 。參考官方note說明

image
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í)懶加載的過程,有任何疑問請留言交流。

參考

https://zhuanlan.zhihu.com/p/25148550

http://www.itdecent.cn/users/e19752dfa551

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容