Android AsyncTask 后监听异步加载完毕的动作详解

 更新时间:2016年11月15日 11:47:35   作者:Terry_龙  
这篇文章主要介绍了Android 使用AsyncTask 后监听异步加载完毕的动作的相关资料,需要的朋友可以参考下

Android 使用AsyncTask 后监听异步加载完毕的动作

  AsyncTask 的使用方法网上有很多例子,使用起来也非常的方便。这里就不详细说具体的使用方法了,同学可以Google 一下,很多。

场景模拟

      当我们在加载一个列表的时候,比如GridView ,这时候我们考虑到不阻塞UI的做法,一般会使用线程Thread 、Timer 或者使用AsyncTask ,而这些操作都是在在后台另外开一个线程给我们找数据,具体得到的数据需要使用Handler 去更新UI,AsyncTask 也是一样使用到的Handler 只是它将Handler 封装在了onPostExecute 执行操作中。而这一操作可能会产生一个问题,比如你有一个列表更新数据库使用到的是AsyncTask 异步操作的方式更新UI,而你的需求是当我一进来这个列表就统计这个列表的数据的数量或者让某一行数据的状态为选中状态。传统做法是直接new 一个AsyncTask 类让它execute(); 之后会再操作UI。想法是对的,但有一个问题我们要注意到,因为它是异步加载数据的方式,而你的数据量比较多或许查找数据需要一定的时间的时候,这时使用AsyncTask 执行异步加载后更新UI再操作UI对象,可能会报空指针。

      这个问题的产生是,我们都知道代码的执行是自上而下执行,当你使用异步加载数据的时候,代码让你去执行异步操作就不管了(多线程),而继续会往下执行代码,你下面的代码就是操作列表里面的UI,这时可想而知,异步加载数据还没有结束还没有对你的UI进行更新,这些你的列表应该是空的,而操作一个空的列表就会报空指针。

分析问题

   使用过AsyncTask 的同学都知道一个异步加载数据最少要重写以下这两个方法:

doInBackground   后台执行,比较耗时的操作都可以放在这里。注意这里不能直接操作UI。

onPostExecute   相当于Handler 处理UI的方式,在这里面可以使用在doInBackground 得到的结果处理操作UI。

     有必要的话你还得重写以下这三个方法,但不是必须的:

onProgressUpdate   可以使用进度条增加用户体验度。

onPreExecute           这里是最终用户调用Excute时的接口

onCancelled             用户调用取消时,要做的操作

      根据上面的思路,可以看出,最终数据加载并显示出来这一系列的操作都在onPostExecute  这个方法里面,那么如何监听所有UI都己经在onPostExecute   里面处理完成了,再去执行我们自己要操作呢?

解决问题

       这里给出我自己解决这一问题的思路,有更好想法的朋友欢迎跟贴共同探讨。

       首先创建一个接口


private interface isLoadDataListener {
    public void loadComplete();
  }
   声明这一接口变量

 

private isLoadDataListener loadLisneter;

  给接口赋值,得到接口对象


public void setLoadDataComplete(isLoadDataListener dataComplete) {
    this.loadLisneter = dataComplete;
  }
 

之后在AsyncTask 的onPostExecute处理UI完成后调用该接口,下面给出一个我以前项目使用到的AsyncTask 类:

  class loadGridAsyncTask extends AsyncTask<Integer, Integer, AppsAdapter> {

    private int poindex;

    public loadGridAsyncTask(int positionindex) {
      this.poindex = positionindex;
    }

    @Override
    protected AppsAdapter doInBackground(Integer... params) {
      // TODO Auto-generated method stub
      // mAppsModel.clear();
      Cursor temp = dbHelper.queryPageById(poindex);
      loadPage(mApps, temp);
      temp.close();
      return new AppsAdapter(STB.this, mAppsModel);
    }

    @Override
    protected void onPostExecute(AppsAdapter result) {

      gridViewExt itemGrid = (gridViewExt) viewFlipper
          .getChildAt(poindex);
      itemGrid.setColumnCount(pageColumnCount);
      itemGrid.setAdapter(result);
      if (loadLisneter != null) {
        loadLisneter.loadComplete();
      }
       
    }

  }

 

       通过上面的代码,我们就得到一个数据加载完成后返回的接口,接下来的问题就是我们利用这个接口来处理我们的UI了,比如让某一UI选中,得到这个列表的UI数量等,看下面的代码:



new loadGridAsyncTask(1).execute();
                  setLoadDataComplete(new isLoadDataListener() {

                    @Override
                    public void loadComplete() {
                      // TODO Auto-generated method stub
                       //这里执行你要的操作,当UI更新完成后会自动调用这里面的代码                    }
                  });

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

相关文章

  • 将cantk runtime嵌入到现有的APP中的方法

    将cantk runtime嵌入到现有的APP中的方法

    今天小编就为大家分享一篇关于将cantk runtime嵌入到现有的APP中的方法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12
  • AndroidStudio升级4.1坑(无法启动、插件plugin不好用、代码不高亮)

    AndroidStudio升级4.1坑(无法启动、插件plugin不好用、代码不高亮)

    这篇文章主要介绍了AndroidStudio升级4.1坑(无法启动、插件plugin不好用、代码不高亮),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-10-10
  • android实现播放网络视频

    android实现播放网络视频

    这篇文章主要为大家详细介绍了android实现播放网络视频,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-04-04
  • Android Service服务详细介绍及使用总结

    Android Service服务详细介绍及使用总结

    这篇文章主要介绍了Android Service 服务的详细资料,网上关于Android Service 服务的文章比较多,但是不是很全面,不够细致,毕竟是Android 四大组件之一,重要性不用说,这里总结下,需要的朋友可以参考下
    2016-12-12
  • Android编程中selector背景选择器用法实例分析

    Android编程中selector背景选择器用法实例分析

    这篇文章主要介绍了Android编程中selector背景选择器用法,结合实例形式较为详细的分析了Selector的结构描述与使用技巧,需要的朋友可以参考下
    2016-01-01
  • Android 高仿微信语音聊天页面高斯模糊(毛玻璃效果)

    Android 高仿微信语音聊天页面高斯模糊(毛玻璃效果)

    大家在使用微信聊天的时候有没有注意到微信语言聊天用的是高斯模糊效果,基于代码是如何实现的呢?下面小编给大家带来了Android 高仿微信语音聊天页面高斯模糊(毛玻璃效果),感兴趣的朋友一起看下吧
    2016-08-08
  • 利用Kotlin的协程实现简单的异步加载详解

    利用Kotlin的协程实现简单的异步加载详解

    这篇文章主要给大家介绍了关于利用Kotlin的协程实现简单的异步加载的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2018-03-03
  • Android仿银行客户签名并且保存签名的截图文件并命名为本地时间

    Android仿银行客户签名并且保存签名的截图文件并命名为本地时间

    本文通过实例代码给大家介绍了Android仿银行客户签名并且保存签名的截图文件并命名为本地时间,需要的朋友可以参考下
    2017-07-07
  • Android 访问文件权限的四种模式介绍

    Android 访问文件权限的四种模式介绍

    这篇文章主要介绍了Android 访问文件权限的四种模式介绍的相关资料,非常不错具有参考借鉴价值,需要的朋友可以参考下
    2016-06-06
  • 详解Android安全防护之加密算法

    详解Android安全防护之加密算法

    Android应用对安全防范这方面要求越来越高了。特别是金融行业,如果app没有没有做好安全处理,那些很容易被一些Hacker(黑客)所攻击。并不是说做了这些安全防范,这个应用就百分之百的安全的。只是说能够尽可能加大破解难度。本文将详细介绍Android安全防护之加密算法。
    2021-06-06

最新评论