简介
Asynctask , 可以开启一个多线程执行任务,并且多线程的数据传递也是这个类自己完成。Asynctask 相比 thread 和handler 更加轻量级一点。
使用
首先继承Asynctask<Params,Progress,Result>
类 ,并必须实现doInBackground(..)方法
范型参数说明:
Params:后台任务的输入参数,比如http请求的目标url
Progress:后台任务执行的进度
Result:后台任务返回的结果,比如Api调用返回的json数据
方法:
onPreExecute(), UI线程调用,在后台任务执行前调用,可以做一些准备工作,可以不实现。
doInBackground(Params…),后台线程执行,耗时的任务写在这里,必须实现。在这个方法里可以调用publishProgress方法来更新后台任务的实时进度。
onProgressUpdate(Progress…),UI线程执行,在publishProgress方法被调用后,UI线程调用它来显示任务的进度,如在进度条上显示,或textView上显示百分比。
onPostExecute(Result),UI线程调用,doInBackground()执行完成后被调用,可以返回后台任务执行的结果。
onCancelled(),UI线程主动调用,有两个,有参数,无参数,来取消后台任务的执行,如activity被销毁,但是后台任务还没完成,就需要在activity的onDestory()方法中调用Asynctask实例的onCancelled()方法。
注意事项
主动调用asynctask的cancel方法,他会执行完doInBackground方法,然后执行onCancelled方法,不执行onPostExecute方法了。(除非在doInBackground方法中“定期检查”isCancelled()是否为true ,若为true 直接返回也行。)
asynctask一个实例只能execute一次。
源码中有参数的onCancelled直接调了无参数的那个函数。
protected void onCancelled(Result result) {
onCancelled();
}
比较service,Thread,IntentService,AsyncTask
Service | Thread | IntentService | AsyncTask | |
---|---|---|---|---|
什么时候去用? | 没有界面的任务,但是不能太长。对于长时间的任务,在服务中使用多线程 | -通常是长时间的任务。 -并行的任务使用多线程(传统机制) | -长任务没有经常和主线程进行交互 -如果必须交互,可以使用主线程handle或者broadcast intents -当需要回调时候(intent启动任务) | -长任务需要和主线程交互 -并行任务使用多实例或执行器 |
触发,启动 | 使用方法onStartService() | 方法:Thread start() | intent | 调用方法execute() |
触发的线程 | 任何线程 | 任何线程 | 主线程 | 主线程 |
运行的线程 | 主线程 | 它自己的线程 | 单独的工作线程 | 工作线程,但是 |
局限/缺点 | 可能阻塞主线程 | -手动线程控制 -代码可能很难去阅读 | -不能并行执行任务 -多个意图会在同一个工作线程排队 | -一个实例只能被执行一次(因此不能在一个循环中执行) -必须在主线程中创建和执行 |