Android开发你应该懂的:AsyncTask

《Android开发你应该懂的:AsyncTask》 Android开发你应该懂的

1.什么是AsyncTask

AsyncTask的存在是为了让我们更方便的操作UI线程,该类允许执行后台操作并在UI线程上更新结果,而不必操作线程和或处理程序。

2. 如何使用

1.继承AsyncTask,并实现它的3个方法

private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
     protected Long doInBackground(URL... urls) {
         int count = urls.length;
         long totalSize = 0;
         for (int i = 0; i < count; i++) {
             totalSize += Downloader.downloadFile(urls[i]);
             publishProgress((int) ((i / (float) count) * 100));
              //如果调用cancel()方法,则提前结束任务
             if (isCancelled()) break;
         }
         return totalSize;
     }

     protected void onProgressUpdate(Integer... progress) {
         setProgressPercent(progress[0]);
     }

     protected void onPostExecute(Long result) {
         showDialog("Downloaded " + result + " bytes");
     }
 }
 

2.创建完成后,调用以下方法执行

 new DownloadFilesTask().execute(url1, url2, url3);

2.AsyncTask的泛型类型

AsyncTask继承自Object,定义如下:

android.os.AsyncTask<Params, Progress, Result>

AsyncTask是一个抽象类,当我们定义一个类来继承AsyncTask这个类的时候,我们需要为其指定3个泛型参数:

①Params::异步任务执行时传入的参数类型;
②Progress:异步任务执行过程中,返回下载进度值的类型;
③Result:异步任务执行完后返回给UI线程的结果的类型;

如果AsyncTask确定不需要传递具体参数,那么这三个泛型参数可以用Void来代替

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

3.AsyncTask使用时4个步骤

当我们执行一个异步任务的时候,通常需要按照下面的4个步骤分别执行

  1. onPreExecute(), 这个方法是在执行异步任务之前的时候执行,并且是在UI 线程当中执行的,通常我们在这个方法里做一些UI控件的初始化的操作,例如显示进度条
  2. doInBackground(Params…), 在onPreExecute()方法执行完之后,会立即执行这个方法,这个方法就是用来处理耗时操作的,任务一旦完成就可以通过return语句来将任务的执行结果进行返回,其实就是发送给我们的最后一个 onPostExecute 方法,在这个方法中是不可以进行UI操作的,如果需要更新UI,比如说反馈当前任务的执行进度,可以调用publishProgress(Progress…)方法来完成。
  3. onProgressUpdate(Progress…), 这个方法是在调用publishProgress(Progress …)之后,在UI线程上调用,利用publishProgress传递的数值来更新下载进度。
  4. onPostExecute(Result),当我们的异步任务执行完之后,就会将结果返回给这个方法,这个方法也是在UI 线程当中调用的,我们可以将返回的结果显示在UI控件上

4.AsyncTask的其它知识点

1.取消任务(Cancelling a task)

除了上面四个方法,AsyncTask还提供了onCancelled()方法,
在任何时候都可以通过调用cancel(boolean)来取消任务。
调用此这个方法后,isCancelled()将返回true。如果调用了这个方法,那么在 doInBackgroud() 方法执行完之后,就不会调用 onPostExecute() 方法了,取而代之的是调用 onCancelled() 方法。为了确保Task已经被取消了,我们需要经常调用 isCancelled() 方法来判断,如果有必要的话。

2.线程规则(Threading rules)

在使用AsyncTask做异步任务的时候必须要遵循的原则
1.AsyncTask类必须在UI线程中加载,在Android Jelly_Bean(4.1)版本后这些都是自动完成的
2.AsyncTask的对象必须在UI Thread当中实例化
3.execute方法必须在UI Thread当中调用
4.不要手动调用onExcute(),onPostExecute(Result),doInBackground(Params …),onProgressUpdate(Progress …)。

  1. AsyncTask任务只能执行一次(如果执行第二次,会引发异常)。
点赞