当前位置 : 主页 > 编程语言 > java >

Android Fragment 懒加载

来源:互联网 收集:自由互联 发布时间:2022-06-23
方案一 public class LazyLoadFragment extends Fragment { //判断是否已进行过加载,避免重复加载 private boolean isLoad=false; //判断当前fragment是否可见 private boolean isVisibleToUser = false; //判断当前fragmen

方案一

public class LazyLoadFragment extends Fragment {
//判断是否已进行过加载,避免重复加载
private boolean isLoad=false;
//判断当前fragment是否可见
private boolean isVisibleToUser = false;
//判断当前fragment是否回调了resume
private boolean isResume = false;
@Override
public void onResume() {
super.onResume();
isResume=true;
lazyLoad();
}

@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
Log.i(TAG, “setUserVisibleHint: “+isVisibleToUser+” “+FragmentD.this);
this.isVisibleToUser=isVisibleToUser;
lazyLoad();
}

private void lazyLoad() {
if (!isLoad&&isVisibleToUser&&isResume){
//懒加载。。。
isLoad=true;
}
}


方案二

解决问题:

1.ViewPager的懒加载模式为了让切换更加流畅,但是会多预加载的Fragment需要的数据进行网络请求,当多个Fragment都存在大量数据的时候,容易因为队列中请求较多导致卡顿,也浪费流量。

2.频繁切换ViewPager造成过多的网络请求。

3.在UI还没有渲染完成的时候请求数据,导致空指针异常。

解决方案:抽象基类的创建

public abstract class BasePageFragment extends Fragment {
protected boolean isViewInitiated;
protected boolean isVisibleToUser;
protected boolean isDataInitiated;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}

@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
isViewInitiated = true;
prepareFetchData();
}

@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
this.isVisibleToUser = isVisibleToUser;
prepareFetchData();
}

public abstract void fetchData();

public boolean prepareFetchData() {
return prepareFetchData(false);
}

public boolean prepareFetchData(boolean forceUpdate) {
if (isVisibleToUser && isViewInitiated && (!isDataInitiated || forceUpdate)) {
fetchData();
isDataInitiated = true;
return true;
}
return false;
}
}

看代码这里只有一个setUserVisibleHint需要说下,此方法用于判断Fragment上面的UI是否已经可视了,所以在prepareFetchData方法里我们做如下判断:就是当前UI可见,并且fragment已经初始化完毕,如果网络数据未加载,那么请求数据。由于我们选用的是

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.RecyclerView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/recyclerview"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_centerVertical="true"
android:scrollbars="none">

</android.support.v7.widget.RecyclerView>

此插件有下拉刷新的回调方法,所以当你主观需要刷新的时候可以直接下拉刷新数据,就不要每一次切换页面都发起请求了。

接下里就是ViewPager中的Fragment只需要继承改抽象类,实现

 fetchData() 方法即可:

@RequiresApi(api = Build.VERSION_CODES.HONEYCOMB)
public class Item1Fragment extends BasePageFragment {

private XRecyclerView xRecyclerView;
private ItemAdapter adapter = null;

private List<TaskDetail> lists;

public Item1Fragment() {
}


@Override
public void fetchData() {
ApiServiceUnified.getOurInstance().getTaskList("23442704051802179';", "0",
null,
null,
new retrofit2.Callback<ResponseUnified60001>() {
@Override
public void onResponse(Call<ResponseUnified60001> call, Response<ResponseUnified60001> response) {

}

@Override
public void onFailure(Call<ResponseUnified60001> call, Throwable throwable) {

}
});
}

@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_item1,null);
xRecyclerView = view.findViewById(R.id.recyclerview);
xRecyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
initData();


adapter = new ItemAdapter(getContext(),lists);
xRecyclerView.setAdapter(adapter);

adapter.setOnClickItemListener(new ItemAdapter.OnClickItemListener() {
@Override
public void onClick(TaskDetail taskDetail) {
Intent intent = new Intent(getActivity(), TaskDetailsActivity.class);
switch (taskDetail.getType()){
case "1"://待派件
break;
case "2"://待回收
break;
case "3"://代送回执包
break;
}
startActivity(intent);
}
});

return view;
}
}

可以实现的效果,就是只有当Fragment渲染完成才发起请求,切在预加载的页面中,请求过的页面不会再第二次发起请求,如果需要就下拉刷新。


上一篇:2020年8月14日
下一篇:没有了
网友评论