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

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.



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




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值