记录一下使用AsyncTaskLoader的使用方法

2020-01-17  本文已影响0人  桃先森_

至于使用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开发哦,随时沟通探讨技术。

上一篇下一篇

猜你喜欢

热点阅读