[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
,Progress
andResult
, and 4 steps, calledonPreExecute
,doInBackground
,onProgressUpdate
andonPostExecute
.
简单的来说AsyncTask就是一个简单的用来避免UI阻塞的,运行在background的工具线程类。我们不需要人工来处理这个线程的生命周期,而是按照一定的规则来执行的。
这个Task有3个参数,分别是传入的参数(Params),执行过程中产生的参数(Process),与最后任务结束返回的结果(Result)。如果有不需要的参数,可以用Void来替代。
有4个步骤,分别是:
onPreExecute():用来处理任务执行前需要做的初始化
doInBackground():真正开始在后台执行操作的步骤(这个是必须override的步骤),在这个步骤中可以使用publishProgress(progress……)来提供用于与UI交互显示信息
onProgressUpdate():用来执行过程中即时显示处理进度的函数(获取到doInBackground里面传递过来的参数而进行显示)
onPostExecute();任务执行结束后做的事情
[1]下面是一个简单的AsyncTask范例:
[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()
execute(Params...)
must be invoked on the UI thread.(必须在UI thread中叫起执行task) onPreExecute()
,onPostExecute(Result)
,doInBackground(Params...)
,onProgressUpdate(Progress...)
manually.(不要手动去呼叫那4个方法) AsyncTask guarantees that all callback calls are synchronized in such a way that the following operations are safe without explicit synchronizations.
onPreExecute()
, and refer to them indoInBackground(Params...)
. doInBackground(Params...)
, and refer to them inonProgressUpdate(Progress...)
andonPostExecute(Result)
.