[0]首先让我们看看官网上是怎么解释AsyncTask的:

AsyncTask enables proper and easy use of the UI thread. This class allows to perform background operations and publish results on the UI thread without having to manipulate threads and/or handlers.

An asynchronous task is defined by a computation that runs on a background thread and whose result is published on the UI thread. An asynchronous task is defined by 3 generic types, calledParams,ProgressandResult, and 4 steps, calledonPreExecute,doInBackground,onProgressUpdateandonPostExecute.

简单的来说AsyncTask就是一个简单的用来避免UI阻塞的,运行在background的工具线程类。我们不需要人工来处理这个线程的生命周期,而是按照一定的规则来执行的。

这个Task有3个参数,分别是传入的参数(Params),执行过程中产生的参数(Process),与最后任务结束返回的结果(Result)。如果有不需要的参数,可以用Void来替代。

有4个步骤,分别是:

onPreExecute():用来处理任务执行前需要做的初始化

doInBackground():真正开始在后台执行操作的步骤(这个是必须override的步骤),在这个步骤中可以使用publishProgress(progress……)来提供用于与UI交互显示信息

onProgressUpdate():用来执行过程中即时显示处理进度的函数(获取到doInBackground里面传递过来的参数而进行显示)

onPostExecute();任务执行结束后做的事情


[1]下面是一个简单的AsyncTask范例:

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));         }         return totalSize;     }     protected void onProgressUpdate(Integer... progress) {         setProgressPercent(progress[0]);     }     protected void onPostExecute(Long result) {         showDialog("Downloaded " + result + " bytes");     } }

要让一个Task开始执行,只需要像下面这样:

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


[2]那么如何取消一个AsyncTask呢?

A task can be cancelled at any time by invokingcancel(boolean). Invoking this method will cause subsequent calls toisCancelled()to return true. After invoking this method,onCancelled(Object), instead ofonPostExecute(Object)will be invoked afterdoInBackground(Object[])returns. To ensure that a task is cancelled as quickly as possible, you should always check the return value ofisCancelled()periodically fromdoInBackground(Object[]), if possible (inside a loop for instance.)

我们可以在任何时候call cancel(boolean)的方法来取消一个Task,如果呼叫到这个方法会导致之后呼叫isCancelled()返回true.那么如果这样的话,之后会用onCancelled(Object)来替代onPostExecute(Object)的执行。

为了确保这个Task能够尽快被取消,我们需要在doInBackground(Object[])执行的时候去checkisCancelled()

[3]使用Thread需要注意的事项:

  • The task instance must be created on the UI thread.(这个task必须在UI thread中创建)
  • execute(Params...)must be invoked on the UI thread.(必须在UI thread中叫起执行task)
  • Do not callonPreExecute(),onPostExecute(Result),doInBackground(Params...),onProgressUpdate(Progress...)manually.(不要手动去呼叫那4个方法)
  • The task can be executed only once (an exception will be thrown if a second execution is attempted.) (这个task必须是单次执行的,不要在这个任务没有结束前再次呼叫)
[4]下面两个行为是安全的,因为AsyncTask的所有callback function都是synchronized.

AsyncTask guarantees that all callback calls are synchronized in such a way that the following operations are safe without explicit synchronizations.

  • Set member fields in the constructor oronPreExecute(), and refer to them indoInBackground(Params...).
  • Set member fields indoInBackground(Params...), and refer to them inonProgressUpdate(Progress...)andonPostExecute(Result).


写的不好,请多指教,谢谢!




更多相关文章

  1. Android中为什么在子线程不能更新UI
  2. Android 真的不能在子线程更新UI吗?
  3. Android 在非UI线程中读网络数据
  4. Android使用AsyncTask实现多线程下载的方法
  5. asynchttpclient的post方法发送json格式参数和表单格式参数
  6. Camera.Parameters android相机参数
  7. android studio 主线程中访问网络,遇到android.os.NetworkOnMainT
  8. [读书笔记]Android LayoutInflater.inflate方法参数详解原理分析

随机推荐

  1. Android(安卓)Activity延迟跳转
  2. Android(安卓)Crash signal 4 (SIGILL),
  3. Android(安卓)鑱氬悎闊充箰鎾斁鍣?/h1>
  4. Android与JS的交互简单实现
  5. Android 来去电自动录音(一)
  6. Android studio 天朝下 从下载到环境配置
  7. android:gravity / android:layout_gravi
  8. android中的全局变量定义与使用
  9. Android模拟器介绍及操作
  10. [置顶] Android(安卓)Lint使用分析