Fragment延迟加载



I/FragmentOne: setUserVisibleHint: false
I/FragmentTwo: setUserVisibleHint: false
 I/FragmentOne: onAttach:
I/FragmentOne: onAttach: 
I/FragmentOne: onCreate: 
I/FragmentOne: setUserVisibleHint: true
I/FragmentOne: onCreateView: 
I/FragmentOne: onActivityCreated: 
I/FragmentOne: onStart: 
I/FragmentOne: onResume: 


 I/FragmentTwo: onAttach: 
I/FragmentTwo: onAttach: 
I/FragmentTwo: onCreate:
I/FragmentTwo: onCreateView:
I/FragmentTwo: onActivityCreated: 
I/FragmentTwo: onStart: 
I/FragmentTwo: onResume:

首先,对于那些还没有在界面显示的fragment,也会调用onstart()和onresume()方法,而 不同activity的两个方法只在可见时调用。


ViewPager会在加载Fragment时候,提前加载显示fragment和它左右两边的fragment,但是有时候,我们并不需要这的优化,所以需要延迟加载,避免不必要的加载。

关键的方法是  setUserVisibleHint(boolean isVisibleToUser) ,这个方法会在 开始的时候被调用,

isVisibleToUser为false,,然后,对显示的fragment来说(例子中的fragmentone),它会被再次调用此时isVisibleToUser 就是 true,而其他已经加载的fragment (例子中的fragmenttwo)只会在显示自己的时候调用该方法显示为true。所以我们就 可以利用这个函数,实现延迟加载。


我们需要设置两个标志位,分别再setuserVisbleHint()和oncreateView()中调用,需要同时在两个方法中调用,因为对于fragmentone来说,它是先 isvisible为true 然后在oncreateview方法中iscreated为true,在oncreateVIew() 方法中调用最终的lazydata()方法,而对于fragmenttwo来说,它是 iscreated 先为true,然后在 isvisible为true,在setuserVisbleHint()中调用 lazydata()方法。


抽象出的基类中,实现了releaseData()方法,用于释放数据,不是必须实现,只在需要时重写即可。



import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

/**
 * Created by wuqi on 2016/8/9.
 */
public abstract class LazyFragment extends Fragment {

    private   boolean isCreated = false;
    private   boolean isVisible = false;
    private static final String TAG = "LazyFragment";

    @Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);
        if(isVisibleToUser){
            isVisible = true;
            if(isCreated){
                lazyData();
            }
        }else {
            isVisible = false;
            if(isCreated){
                releaseData();
            }
        }

    }

    protected void releaseData(){
        Log.i(TAG, "releaseData: ");
    }

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(getLayoutid(),container,false);
        intialView(view);
        isCreated = true;
        if(isCreated&&isVisible){
            lazyData();
        }

        return view;
    }

    protected abstract void lazyData();

    protected abstract int getLayoutid();
    protected abstract void intialView(View view);
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值