异步处理的目的:完成任务的同时不阻塞主线程(UI线程)
异步任务机制:Handler,AsyncTask
Handler
涉及Handler、Looper、Message、Thread四个对象。
实现异步的流程:主线程启动Thread->子线程运行并生成Message->Looper获取Message并传递给Handler->Handler逐个获取Message并进行UI更新
优点:结构清晰,功能定义明确。对于多个后台任务时简单清晰
缺点:在单个后台异步处理时代码过多,结构过于复杂
AsyncTask
是一个直接继承于Object类的轻量级后台任务类,包为:android.os.AsyncTask。在类中实现异步操作,并提供接口反馈当前异步执行的程度,最后反馈执行的结果给UI主线程。
优点:简单快捷,过程可控
缺点:在使用多个异步操作和并需要进行UI变更时较为复杂
AsyncTask的泛型构造参数
public abstract class AsyncTask<Params,Progress,Result>{}
Params:启动任务执行的输入参数,比如HTTP请求的URL
Progress:后台任务执行的进度百分比
Result:后台任务执行的最终返回结果
重写的方法:
onPreExcute():
doInBackground(Params params)
onProgressUpdate(Progress value)
onPostExcute(Result result)
onCancelled()
注意事项:
1、AsyncTask的实例必须在UI Thread中创建
2、execute方法必须在UI Thread中调用
3、不需要手动调用onPreExcute(),doInBackground(Params params),onProgressUpdate(Progress value),onPostExcute(Result result)这四个方法
4、该task只能被执行一次,否则多次调用时会出现异常
5、不能在doInBackground()中更改UI组件的信息