最近项目中用到异步任务功能,网上搜罗了下资料,奈何国内的质量实在太低,依靠伟大的谷歌搜到很多国外的文章,写的非常的好,更好的在于没有copy paste的成分.
本文内容转自:http://www.brighthub.com/mobile/google-android/articles/82805.aspx
英语好的朋友请直接阅读原文.小弟不才,做个苦力当翻译
介绍
我们的Android应用越来越复杂,连接服务端,和web交互数据,存储大文件在android数据库中的同时显示进度条或者在通知栏显示通知. 我们如何能在抛开UI线程的情况下,边接受处理数据边用进度条展示呢?开始之前,必须知道什么是"UI线程"?
如果你熟悉"Thread"的概念. 那么你应该很容易明白异步任务. Android应用在处理的时候只有一个main主线程在运行.这个看上去像在任何地方只有一个任务. 如果你只有一个UI线程在工作,你就不能做一些复杂的事情,比如同时存储10000条记录,这个时候应用会停住,直到1000条记录存储完毕. 这不是一个好的方式. 在android你可以在一个应用里,同一时间运行多个线程. 举例:一个后台任务可以从服务端接受数据并且存储到本地数据库中.
如何对"Thread"概念有足够的了解,那么我们继续
现在我们可以开始了吗? 开始在后台执行任务? 这里我们还有几步工作要做.
一个古老的路线方法是使用Thread线程类,使用Handlers 和Runnables. 但是我们有更好的方式。使用AsyncTask 类
AsyncTask 类
让我来看看AsyncTask类的结构
private class myBrightHubTask extends AsyncTask protected void onPreExecute(){ } 这个方式是在执行新线程前运行. 这里没有输入和输出的参数,所以这个可以初始化一些你认为必要的参数. protected Z doInBackground(X...x){ } 这是个非常重要的方法. 你可以在这里定义你需要的在后台执行的方法.这里开始是一个独立的线程在运行,而不是main线程. 这个方法接收一组对象集合,对象可以是在前继承AsyncTask的时候定义的X类型(你看到这个类的一开始我们继承的AsyncTask类了吗?这里的X就是这里的类型),默认是Object集合. protected void onProgressUpdate(Y y){ } 这个方法是在使用publishProgress()方法时触发,这个方法常用于显示一些在主线程中执行的进度条或者一些信息展示.比如当在执行一个后台任务的时候,前台做一个滚动条在滚动 , protected void onPostExecute(Z z){ }
这个方法在后台任务完成后执行,传入一个参数Z,也是前面定义的那个,你可以使用这个参数做一些结束任务时的处理,比如跳转intent或者其他的事情.
X,Y,Z的是什么类型?
我想你也可以从上面的结构中得出结论:
X – 运行后台任务的时候,需要传入的参数类型. 可以是一个对象的集合.
Y – 当你需要使用onProgressUpdate方法时,传入的参数类型
Z – 当后台任务完成时,需要传入数据处理的数据类型
如何使用这个异步任务呢?执行要执行下面2行代码.
myBrightHubTask brightHubTask = new myBrightHubTask(); brightHubTask.execute(x);
这里的输入参数是前面讲的X类型
一旦我们运行异步任务.你可以使用getStatus()方法获取它的状态
brightHubTask.getStatus();
我们可以接受下面几个状态:
RUNNING – 任务处理中
PENDING – 任务还没有完成.
FINISHED – 任务结束.
提醒
需要注意的是:
-
不用主动去调用onPreExecute, doInBackground and onPostExecute这个三个方法.这些方法会自动执行.
-
你不能在另外一个AsyncTask或者线程中使用异步任务. 调用异步任务必须在UI主线程中使用.
-
onPostExecute 这个方法时在UI主线程中执行.这里你可以调用另外一个异步任务.
-
输入参数可以设置一个Object集合,这样你就可以传入任意类型的对象
评论关闭。