`
mmdev
  • 浏览: 12892328 次
  • 性别: Icon_minigender_1
  • 来自: 大连
文章分类
社区版块
存档分类
最新评论

【Android】使用AsyncTask来处理一些简单的需要后台处理的动作

 
阅读更多


[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范例:


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


[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.



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




分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics