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更新完成后会自动调用这里面的代码 } });
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
本文向大家介绍详解ios监听reloadData刷新列表完毕的时机,包括了详解ios监听reloadData刷新列表完毕的时机的使用技巧和注意事项,需要的朋友参考一下 分析: reloadData 是一个异步方法,并不会等待 UITableView 或者 UICollectionView (后面统称 listView )真正刷新完毕后才执行后续代码,而是立即执行后续代码。我们执行 reloadDa
问题内容: 使用以下构建器时,有没有办法侦听毕加索的事件: 我想打电话和父所以它会适当调整,但我不知道如何设置监听器或回调。 我看到毕加索有错误事件报告,但是有成功事件吗? 问题答案: 您可以使用获取onSuccess和onError事件。只需向您的请求添加新的回调,如下所示: 然后,您可以在onSuccess回调中执行任何更改和修改。
在使用生成器时,是否有办法监听毕加索的事件,如: 我正在尝试在父上调用和,以便正确调整大小,但我不知道如何设置侦听器或回调。 我看到毕加索有错误事件报告,但有成功事件吗?
我有下面的代码来加载毕加索的图像,在下载图像时使用可绘制的占位符来显示图像。不过,我想要的是一个动画旋转进度条样式的微调器,它可以在图像加载时不断地旋转,就像我在大多数专业应用程序中看到的那样。毕加索似乎不支持这一点,只支持静态图像绘制。有没有办法让它与毕加索合作,或者我必须做些不同的事情?
本文向大家介绍vue-cli监听组件加载完成的方法,包括了vue-cli监听组件加载完成的方法的使用技巧和注意事项,需要的朋友参考一下 在使用vue-cli开发项目时遇到过一个问题,要求是页面组件全部加载完成后再执行某个函数,给上代码参考,方法可能有点笨,好在实现了功能。 1、安装vuex 2、在项目目录下找到store.js文件 3、在子组件中 4、通过store判断子组件数据加载完成 以上这篇
Netbeans 8.0突然无法在Ubuntu 12.04中启动。以前它工作得很好。但现在它没有启动,当我尝试启动时,netbeans蓝色加载框出现,在显示消息“加载模块完成”后,它消失了 过去,netbeans 7.4也发生过这种情况,当时我禁用了一些插件(可能是由于禁用了一些Hudson插件/Husdon UI插件)。但这次可能是在插件自动更新之后,我不知道现在是哪一个插件。我也尝试删除整个缓