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

  次阅读 来源:互联网(转载协议) 2016-01-14 12:44 我要评论(0)

当我们在加载一个列表的时候,比如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);

本站部分文章来源于网络以及网友投稿,本站只负责对文章进行整理、排版、编辑,是出于传递更多信息之目的,并不意味着赞同其观点或证实其内容的真实性。如果您有什么意见或建议,请联系QQ28-1688-302!

人工智能实验室
相关文章相关文章
  • Oculus公布原型机,大幅度提升可视角,能实现140°的视场水平

    Oculus公布原型机,大幅度提升可视角,能实现140°的视场水平

  • teamLab创始人猪子寿之: 抛去衣食住行,我还剩下什么?

    teamLab创始人猪子寿之: 抛去衣食住行,我还剩下什么?

  • 2018深圳国际人工智能展览会 2018 shenzhen International Artif

    2018深圳国际人工智能展览会 2018 shenzhen International Artif

  • Michael I. Jordan带你解读百万奖金ATEC蚂蚁人工智能大赛

    Michael I. Jordan带你解读百万奖金ATEC蚂蚁人工智能大赛

网友点评网友点评
阅读推荐阅读推荐

据外媒报道,STEER打造了首款完全自动驾驶停车技术,旨在使常规车辆转变为无人驾驶车辆。STEER的首款技术应用是4级自动驾驶及网络安全停车...

近日,美国软性机器抓手制造商 Soft Robotics 宣布,获得 2000 万美元的融资,本轮投资者包括 Scale Venture Partners,Calibrate Ventures...

据外媒报道,加州车管局发布了《2017自动驾驶脱离报告(California Autonomous Vehicle Disengagement Reports)》,其中谈及了脱离的具体...

用人机语音交互,来解决智能家居适老的问题;通过家庭门禁与安防套件、空气净化套件、可燃气体与有害气体监控套件等相互联动,在不同生活情...