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);
}}
浙公网安备 33010602011771号