- 懒加载机制
Fragment在配合ViewPager使用的时候,ViewPager会帮助我们加载左右的Fragment,造成不必要的内存消耗以及流量消耗,懒加载机制主要就是为了解决这个问题,让Fragment只有在可见的时候才会加载数据。其核心就是Fragment的setUserVisibleHint()函数。我们在使用的时候复写这个函数,frahment从不可见到可见的(或从可见到不可见)时候,会回调到该函数。
具体实现:
package fragment;
import android.support.v4.app.Fragment;
/**
* Fragment懒加载
*/
public abstract class LazyFragment extends Fragment{
protected boolean isVisible;
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (getUserVisibleHint()){
isVisible = true;
onVisible();
}else {
isVisible = false;
onInvisible();
}
}
protected abstract void lazyLoad();//懒加载的方法,在这个方法里面我们为Fragment的各个组件去添加数据
protected void onVisible(){
lazyLoad();
}
protected void onInvisible(){
}
}
public class Fragment extends LazyFragment {
private boolean isPrepared; // 标志位,标志已经初始化完成。
//在这个方法里面去给我们的Fragment添加数据
@Override
protected void lazyLoad() {
if (isPrepared && isVisible){
getNewsDate(getActivity(),channelId);
page++;
isPrepared = false;
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = LayoutInflater.from(getActivity()).inflate(R.layout.fragment, container, false);
isPrepared = true;
lazyLoad();//这里我们调用以下去加载我们的数据
return view;
}
另外在也可以通过onHiddenChanged()函数来做类似的操作,该函数在当前Fragment可见状态发生改变的时候才会调用,具体用法也都差不多,在可见的时候去调用数据不可见的时候不调用即可。
另外在AndroidX中,在FragmentTransaction
中增加了 setMaxLifecycle
方法来控制 Fragment 所能调用的最大的生命周期函数。所以在AndroidX中,setMaxLifecycle()
方法用于替代setUserVisibleHint()
方法,可以设置Fragment的状态,由此引出了实现Fragment懒加载的新方案,在构造FragmentPagerAdapter时传入BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT,将加载数据的逻辑放到Fragment的onResume()
方法中即可。
public abstract class NewLazyFragment extends Fragment {
private Context mContext;
private boolean isFirstLoad = true; // 是否第一次加载
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mContext = getActivity();
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = LayoutInflater.from(mContext).inflate(getContentViewId(), null);
initView(view);
return view;
}
@Override
public void onDestroyView() {
super.onDestroyView();
isFirstLoad = true;
}
@Override
public void onResume() {
super.onResume();
if (isFirstLoad) {
// 将数据加载逻辑放到onResume()方法中
initData();
initEvent();
isFirstLoad = false;
}
}
/**
* 设置布局资源id
*
* @return
*/
protected abstract int getContentViewId();
/**
* 初始化视图
*
* @param view
*/
protected void initView(View view) {
}
/**
* 初始化数据
*/
protected void initData() {
}
/**
* 初始化事件
*/
protected void initEvent() {
}
}
- Fragment和Activity的通信
接口回调(觉得最好用)
Handler的方式
广播方案(可以使用本地广播)
EventBus方案
当然还有很多方案,这边就不一一列举了。