虽然使用线程能适用大部分异步的场景,但是代码看起来还是不够简练,在android平台,还有另外一种解决方案----AsyncTask。
首先直接上代码:
private class getRemoteDataTask extends AsyncTask<String, Integer, ArrayList<Hashtable<String, String>>> {
protected void onPostExecute(ArrayList<Hashtable<String, String>> dataList) {
this.cancel(false);
}
@Override
protected ArrayList<Hashtable<String, String>> doInBackground(String... params) {
ArrayList<Hashtable<String, String>> dataList = new ArrayList<Hashtable<String, String>>();
return dataList;
}
}
下面来解释一下,doInBackground方法类似于在线程中的run方法,这个方法是另一个后台线程中执行,然后执行完会通过回调机制执行onPostExecute,神奇之处就在于,onPostExecute这个方法的执行权限又交回给activity的主进程中执行,也就是说onPostExecute这个方法里面可以操作UI。于是就能实现异步读取数据,并且操作UI,是不是比起自己写线程方便很多?
然后我们来剖析一下,这种方案的几个不太容易理解的地方。
一、AsyncTask<String, Integer, ArrayList<Hashtable<String, String>>> 注意这里几个泛型的定义和意义,第一个代表该方法被调用时传递的参数类型,注意是参数的类型,而不是参数的个数,也就是说如果定义为String,那么,该方法被调用时所传递的参数只能是String类型;然后第二个Integer,资料上说是线程后台执行的百分比,不过我没彻底弄清楚这个的含义,欢迎大家指教,然后泛型里的第三个ArrayList<Hashtable<String, String>,这个和该类的两个方法都有密切联系,该泛型是指后台执行返回的结果的类型。
二、doInBackground这个方法是在后台执行的,然后它的返回结果将提供给onPostExecute,所以,doInBackground的返回值必须和AsyncTask类的第三个泛型定义一致,然后onPostExecute的参数类型必须和doInBackground的返回类型一致。
三、前边我们都一直在解释AsyncTask这个类,但是怎么调用呢?其实很简单
new getRemoteDataTask().execute(String... params);
注意,execute方法里传递的参数的类型必须和AsyncTask第一个泛型的类型一致,然后这个方法传递的参数将在
doInBackground(String... params)
这里面起作用。
第四,AsyncTask还有很多方法,我们仅仅分析了其中两个,它被继承后,必须要重写的一个方法是doInBackground,因为doInBackground的返回值将在onPostExecute中被用来更新UI,所以我们姑且认为这两个方法是最重要。
第五、AsyncTask的实例必须在UI线程中被调用、
execute(String...params)必须在UI线程中调用、
不要手动调用onPreExecute(), onPostExecute(Result), doInBackground(Params...), onProgressUpdate(Progress...)等方法、
AsyncTask只执行一次。
分享到:
相关推荐
Android AsyncTask用法和异步加载图片通过AsyncTask 从网络上异步加载一张图片
AsyncTask的使用及ListView的常见优化 asyncTask异步加载数据 使用了LruCache优化图片加载 通过滑动监听提高ListView滑动流畅度.rar,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习...
http://blog.csdn.net/rwyz1314/article/details/6841639 的代码。放在这里做为备份。上一个文件传错了。也没法删除。只好重新传一个。
Android Handler AsyncTask 异步加载
Android中使用ListView数据异步加载与AsyncTask,获取网络资源,线程池技术,多线程技术。
Android异步加载demo Android异步加载三种方式
在实际的开发中过程,我们可能经常要求应用程序做一些“耗时操作”,例如网络下载,加载大量资源等。这时候我们就不能直接在UI线程中(主线程)中去完成这些“耗时操作”,因为,UI线程主要是用来更新界面UI,如果一次...
这是Android 异步加载图片-AsyncTask一文的代码,放在这里做个备份。 原文见 http://blog.csdn.net/rwyz1314/article/details/6841639
android AsyncTask 异步加载图片
参看文档:http://blog.csdn.net/sinat_29398599/article/details/53169918
AsyncTask异步加载使用Demo,详解可以参考《Android中AsyncTask的使用详解》,代码中的注释也比较详细,初学者可以参考。
Android 异步加载图片,对ListView的异步加载图片的功能演示,主要根据url读取图片返回流的方法。为了方便演示,将请求图片的链接先固定,每读取好一个图片就更新,界面比较简单,当然你可以做成比较好的,像很多好...
Android是单线程模型,耗时的操作必须放在非主线程中执行,对此,我们需要使用多线程/线程池或者AsyncTask等来完成异步加载任务。 博客地址:http://blog.csdn.net/chenzheng8975/article/details/53893666
Android Async异步操作实例---加载网络图片,实现进度条的更新
AsyncTask 异步多线程加载Demo
Android 使用AsyncTask 后监听异步加载完毕的动作 AsyncTask 的使用方法网上有很多例子,使用起来也非常的方便。这里就不详细说具体的使用方法了,同学可以Google 一下,很多。 场景模拟 当我们在加载一个列表的...
android 从SD卡上异步加载缩略图 利用AsyncTask 从SD卡上 异步加载 缩略图、
关于异步加载图片的代码,主要使用AsyncTask来实现异步加载。
Android异步加载的框架,优化了AsyncTask,简单易上手
Android Lrucache加载网络图片(AsyncTask ),采用Lrucache算法,AsyncTask 异步缓存加载图片