美文网首页
记录一下使用AsyncTaskLoader的使用方法

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

作者: 桃先森_ | 来源:发表于2020-01-17 14:19 被阅读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开发哦,随时沟通探讨技术。

    相关文章

      网友评论

          本文标题:记录一下使用AsyncTaskLoader的使用方法

          本文链接:https://www.haomeiwen.com/subject/nhvczctx.html