AsyncTask 学习翻译并总结


转账自:http://blog.csdn.net/chenjie19891104/article/details/6271430


最近闲来无事,遂看了一下android文档

其中AsyncTask类以前未用过,这里学习并记录一下:

 

AsyncTask ,见名知意,就是异步任务的意思。android为什么要提供这个类呢?自然有他的妙处和巧处。

 

我们知道,在android中非UI线程是无法对UI进行操作的,而比较耗时的任务,我们一般考虑到UI卡死,不会直接放在UI线程中来完成,而是

另开辟一个线程来完成这个耗时的任务。这样,在另一个线程中当任务完成时,需要将任务的执行结果。反馈到UI怎么办呢?

 

对,除了可以使用Activity的runOnUiTread(Runnable)方法,还有一个同样方便的类,就是AsyncTask。下面是我对SDK文档的翻译了,自己的话。总感觉别扭。呵呵。

 

一、简介:

AsyncTask 类允许你方便正确地使用UI线程。该类可以将耗时的操作放在后台来处理,而不需要人为地另开线程或者使用handlers来完成。

当需要开辟一个后台线程并且其运行结果需要反映到UI线程的时候,AsyncTask就派上用场了。定义一个AsyncTack时,需要指定3种类型(Params,Progress,Result),完成4个步骤(begin,doInBackground,processProgress,end)。

 

二、使用方法:

由于AsyncTask是个抽象类,所以,你需要定义一个类来继承它。同时,这个子类至少需要实现doInBackground(Params...)这个方法。

同时,在多数情况下,您可能还需重写另一个方法:onPostExecute(Result)。

下面是文档中的实例:

  1.  private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {      
  2.       
  3.     protected Long doInBackground(URL... urls) {           
  4.         int count = urls.length;           
  5.         long totalSize = 0;           
  6.         for (int i = 0; i < count; i++) {               
  7.             totalSize += Downloader.downloadFile(urls[i]);               
  8.             publishProgress((int) ((i / (float) count) * 100));          
  9.         }           
  10.         return totalSize;      
  11.     }       
  12.       
  13.       
  14.     protected void onProgressUpdate(Integer... progress) {           
  15.         setProgressPercent(progress[0]);       
  16.     }       
  17.       
  18.     protected void onPostExecute(Long result) {           
  19.         showDialog("Downloaded " + result + " bytes");       
  20.     }   
  21. }  

 

一旦定义类AsyncTask的子类,您就可以直接使用 new DownloadFilesTask().execute(url1,url2,url3)来执行一个任务;

 

三、AsyncTask的三种范型:

 

1、Params:任务执行时需要的参数类型,(就是execute方法传入的类型)。

2、Progress:后台计算中使用的进度单位数据类型

3、Result:任务执行结果的类型

 

注意:并不是所有的类型都需要,如果某个类型不需要,用Void,如:

private class MyTask extends AsyncTask<Void, Void, Void>{...}

 

四、AsyncTask的四个阶段(步骤)

 

当一个任务被执行的时候,他就需要经过下面四个阶段。

 

1、onPreExecute();这个方法,在调用execute()后,立即在UI线程中被执行,该方法通常用于对任务做一些基本的设置,比如在用户界面上显示一个进度条。

2、doInBackground(Params...);这个方法,在onPreExecute()执行完成后,在后台运行。这个方法中就是完成耗时操作。异步任务的Params参数传入该方法,同时,方法的执行结果需要返回,同时需要传入下一个阶段的方法。在这个方法中还可以使用publishProgress(Progress...)改变当前的进度值。这些值将会在onProgressUpdate(Progress...)方法中同步显示在UI线程。

3、onProgressUpdate(Progress...);这个方法是在publishProgress(Progress...)方法被调用之后,在UI线程中执行的。以便后台任务在执行的时候,在用户界面可以显示各种进度信息。例如:可以用进度条模拟进度或者在文本域中显示进度日志。

4、onPostExecute(Result); 该方法在后台任务完成后由UI线程调用,后台任务的执行结果作为参数传入该方法。

 

五、正确使用该类需要注意的几点:

 

1、这个类的实例需要在UI线程中创建

2、execute(Params...)方法必须在UI线程中调用

3、不要人为地调用上面四个步骤对应的方法。

4、一个任务只能执行一次。如果再次请求一个执行,将会报异常。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值