AsyncTask 异步任务

Posted on 2016-07-20 19:42  zyfyp  阅读(82)  评论(0)    收藏  举报

Android单线程模型

当第一次启动一个Android程序时,Android会自动创建一个称为“main”主线程的线程。这个主线程(也称为UI线程)很重要,因为它负责把事件分派到相应的控件,其中就包括屏幕绘图事件,它同样是用户与Andriod控件交互的线程。
Android UI操作并不是线程安全的,并且这些操作必须在UI线程中执行

单线程模型中始终要记住两条法则
1). 不要阻塞UI线程
2). 确保只在UI线程中访问Android UI控件。
问题
使用主线程能不能网络耗时加载图片?
使用子线程能不能下载图片且修改图片控件?

更新UI的3种方式(还有其他方式 handle)

 

 

AsyncTask是android 1.5提供的轻量级的异步类,可以直接继承AsyncTask,在类中实现异步操作,并提供接口反馈当前异步执行的程度(可以通过接口实现UI进度更新),最后反馈执行的结果给UI主线程。
优点:
简单,快捷
过程可控
AsyncTask直接继承于Object类,android.os.AsyncTask

 使用AsyncTask的步骤 

1 添加一个类,继承AsyncTask,并设置相应参数

AsyncTask是一个抽象类.  它需要三种泛型类型的参数,Params,Progress和Result
Params 启动任务执行的输入参数,比如HTTP请求的URL。 一般用String类型
Progress 后台任务执行的百分比。 一般用Integer类型,不需要更新进度的时候用Void(大写字母V)
Result 后台执行任务最终返回的结果,一般用byte[ ]或者String

 

2 重写四个方法


onPreExecute() 该方法将在执行后台操作前会被UI线程调用。可以在该方法中做一些准备工作,如在界面上显示一个进度对话框(ProgressDialog)
doInBackground(Params...) 将在onPreExecute 方法执行后马上执行,该方法运行在后台线程中。负责执行耗时操作。可以在该方法中调用publishProgress方法来通知UI线程更新实时的任务进度
onProgressUpdate(Progress...)在publishProgress方法被调用后,UI 线程将调用本方法更新进度
onPostExecute(Result)在doInBackground 执行完成后,本方法将被UI 线程调用,在此方法中更新UI界面

 

取消AsyncTask任务:

AsyncTask 是通过线程池实现的,所有当一个AsyncTask任务没完成又启动一个AsyncTask启动的AsynTask需要等待前一个AsynTask运行完,才能执行.所以有时候有必要取消AsyncTask任务。

自启动AsyncTask任务的Activity中重写onPause让他的生命周期随这activity一起毁灭。

@override

protected void onPause(){
if(mTask !=null &&mTask.getStatus()==AsyncTask.Status.RUNNING){
mTask.cancel(true);

}}

博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3