至于使用AsyncTaskLoader等等科普文章原理什么的我就不多说了,开门见山我的问题就是viewpager+fragment实现首页几个tab,每次从其它页面返回时,fragment界面会闪一下,最后查到原因是每次AsyncTaskLoader的loadInBackground都会执行一次,而我实例化fragment就放在此处,导致每次从其它界面会闪一下,解决方法就是 在onLoadFinished方法中调用 getLoaderManager().destroyLoader(id)
最后使用方法整理如下
<1>要求只执行一次AsyncTaskLoader,则需要在onLoadFinished方法下掉用 getLoaderManager().destroyLoader(1);
@Override
public void onLoadFinished(@NonNull Loader<ArrayList<Fragment>> loader, ArrayList<Fragment> data) {
//如果不销毁Loader,那么每次onstart都会调用loadInBackground
getLoaderManager().destroyLoader(1);//这个 1 是你们在初始化的id,需保持一致 getLoaderManager().initLoader(1, null, this);
}
<2>正常使用AsyncTaskLoader
① 继承AsyncTaskLoader写一个自己的AsyncTaskLoader, ArrayList<Fragment>泛型可随意更换
public class StudyAsyncTaskLoader extends AsyncTaskLoader<ArrayList<Fragment>> {
public StudyAsyncTaskLoader(@NonNull Context context) {
super(context);
}
@Override
protected void onStartLoading() {
super.onStartLoading();
// 触发 loadInBackground 的事件,防止loadInBackground 不执行
forceLoad();
}
@Nullable
@Override
public ArrayList<Fragment> loadInBackground() {
//写自己的逻辑
return new ArrayList<>() ;
}
/**
* @param data UI线程运作
*/
@Override
public void deliverResult(ArrayList<Fragment> data) {
super.deliverResult(data);
}
}
②在页面初始化,activity或者fragment
getLoaderManager().initLoader(1, null, this);
③实现LoaderManager.LoaderCallbacks
@NonNull
@Override
public Loader<ArrayList<Fragment>> onCreateLoader(int id, @Nullable Bundle args) {
return new StudyAsyncTaskLoader(getActivity());
}
@Override
public void onLoadFinished(@NonNull Loader<ArrayList<Fragment>> loader, ArrayList<Fragment> data) {
}
@Override
public void onLoaderReset(@NonNull Loader<ArrayList<Fragment>> loader) { }
因为Loader是跟宿主生命周期绑定的,所以在没有getLoaderManager().destroyLoader(1);方法情况下,AsyncTaskLoader的loadInBackground会跟着执行
给自己做个笔记的同时也希望能帮助到别人,另外有任何关于Android开发都可以加我微信15733125211,顺便备注一下Android开发哦,随时沟通探讨技术。
网友评论