您的位置:首页 > 移动开发 > Android开发

Android Asynctask

2016-08-05 17:25 176 查看

简介

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

ServiceThreadIntentServiceAsyncTask
什么时候去用?没有界面的任务,但是不能太长。对于长时间的任务,在服务中使用多线程-通常是长时间的任务。

-并行的任务使用多线程(传统机制)
-长任务没有经常和主线程进行交互

-如果必须交互,可以使用主线程handle或者broadcast intents

-当需要回调时候(intent启动任务)
-长任务需要和主线程交互

-并行任务使用多实例或执行器
触发,启动使用方法onStartService()方法:Thread start()intent调用方法execute()
触发的线程任何线程任何线程主线程主线程
运行的线程主线程它自己的线程单独的工作线程工作线程,但是
局限/缺点可能阻塞主线程-手动线程控制

-代码可能很难去阅读
-不能并行执行任务

-多个意图会在同一个工作线程排队
-一个实例只能被执行一次(因此不能在一个循环中执行)

-必须在主线程中创建和执行
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息