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);
}