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更新完成后会自动调用这里面的代码                                        }
                                    });

多谢  记账本   指出本文的一个BUG,上面应改为:

                                    setLoadDataComplete(new isLoadDataListener() {

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

new loadGridAsyncTask(1).execute();

此篇文章希望能对入门不久的Android 开发者有帮助。

转载于:https://www.cnblogs.com/TerryBlog/archive/2011/03/07/1973308.html

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

  1. Android 使用AsyncTask 后监听异步加载完毕的动作-(by terry-龙)

    AsyncTask 的使用方法网上有很多例子,使用起来也非常的方便.这里就不详细说具体的使用方法了,同学可以Google 一下,很多. 场景模拟 当我们在加载一个列表的时候,比如GridView ,这 ...

  2. 延迟加载图片并监听图片加载完成

    要求: 图片延迟加载.未加载完显示加载中.监听图片加载完后,加载中消失. demo: <!DOCTYPE html> <html lang="en"> &l ...

  3. js - 预加载+监听图片资源加载制作进度条

    这两天遇到一个新需求:一个一镜到底的h5动画.因为功能的特殊性,就要求我们提前监听页面的静态图片是否全部加载完毕.即处理预加载. 总结下来,下次这种需求需要提前注意以下几点: 一.图片而不是背景图 本 ...

  4. vue组件加载完成之后执行方法_vue-cli监听组件加载完成的方法

    在使用vue-cli开发项目时遇到过一个问题,要求是页面组件全部加载完成后再执行某个函数,给上代码参考,方法可能有点笨,好在实现了功能. 1.安装vuex npm install vuex --sav ...

  5. android复位机器人图片_Universal-Image-Loader 图片异步加载类库还不熟?

    码个蛋(codeegg) 第 824 次推文 作者:欢醉 博客:https://cloud.tencent.com/developer/article/1026386 码妞看世界 写在前面 这个图片异 ...

  6. Android中的缓存处理及异步加载图片类的封装

    一.缓存介绍: (一).Android中缓存的必要性: 智能手机的缓存管理应用非常的普遍和需要,是提高用户体验的有效手段之一. 1.没有缓存的弊端: 流量开销:对于客户端--服务器端应用,从远程获取图 ...

  7. Mr.J-- jQuery学习笔记(二十五)--监听DOM加载

    页面元素 <body> <div></div> <div></div> <div></div> <div> ...

  8. Android进阶:ListView性能优化异步加载图片 使滑动效果流畅

    ListView 是一种可以显示一系列项目并能进行滚动显示的 View,每一行的Item可能包含复杂的结构,可能会从网络上获取icon等的一些图标信息,就现在的网络速度要想保持ListView运行的很 ...

  9. vue之 watch 监听数据变化 watch的使用、watch监听数据加载完成后执行、watch不触发、不生效的解决办法及原理

    常用方法: watch监听数据完成后执行函数: watch: {huxing: {handler: function(newVal, oldVal) {this.huxingW();},deep: t ...

最新文章

  1. 清华北大留不住,高中毕业去美国读AI本科值不值?
  2. MySQL 8.0 新特性之统计直方图
  3. python 如何获取系统当前时间?datetime.datetime.now() 打印格式化时间(可用作文件名的格式化时间strftime)
  4. springboot中分页插件pageHelper的使用
  5. 接oracle私活价格,也来记录一下第一次接私活的体验
  6. 用python绘制玫瑰花的代码_python也能玩出玫瑰花!程序员的表白代码
  7. D3 scaleThreshold
  8. 题目1140:八皇后
  9. Sysbench 性能压测-MySQL
  10. 红色学校网站模板_学校网站源码_适用高中,中学,小学学校网站建设
  11. 远程重装Win10系统 系统之家装机大师重装教程
  12. 全国区号码表(绝对全)
  13. 爬虫之巨潮资讯网关键词信息获取
  14. 小程序入门说明以及资料整理
  15. pandas.Series.str.extract 正则提取数据
  16. 手机触摸屏扫描信号实测波形
  17. 关于SSM(mybatis)入门01
  18. css3——3D动画、transform-style:preserve-3d、transform:perspective()、perspective-origin
  19. protel 99se元件封装名称
  20. 他被称为中国第一程序员,一人之力单挑微软,如今拜入武当修道(转载)

热门文章

  1. 将内存使用的详细情况输出到文件
  2. 1.2.3 TCP/PI参考模型(应用层、传输层、网际层、网络接口层)、五层参考模型(应用层、传输层、网络层、数据链路层、物理层)、OSI与TCP/IP参考模型比较(转载)
  3. SQL Server中的查询跟踪列值
  4. 索引sql server_SQL Server索引设计基础和准则
  5. sql与nosql_SQL Server JSON函数:NoSQL与关系世界之间的桥梁
  6. 使用PowerShell和SQL的示例可用性监视服务的插图
  7. 浅谈在基本数据包装类中使用'=='与equals的区别
  8. python面试题No6
  9. java-DateFormat
  10. 2018.3.12 Leecode习题 给定一个整数数列,找出其中和为特定值的那两个数。