《Android-Fragment懶加載》

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要懶加載

http://blog.csdn.net/qibanxuehua/article/details/47146779

相關文章
相關標籤/搜索