一、异步消息处理机制:
1)由四个部分组成:Message、Handler、MessageQueue 和 Loope
--Message: 在线程之间传递的消息,它可以在内部携带少量信息,用于在不同线程之间交换数据;
--Handler: 主要用发送和处理消息(Message),发送消息:sendMessage(Message msg); 处理消息:handleMessage(Message msg);
--MessageQueue:消息队列,每个线程中只有一个消息队列,用于存放所有通过Handler发送的消息;
--Looper:是每个线程中的MessageQueue 的管家,调用其 loop() 方法后就会进入到一个无限循环当中,然后每当发现MessageQueue 中存在一条消息,就会将它取出,并传递到Handler 的handleMessage()方法中,每个线程也只有一个 Looper;
2)流程:
--在主线程中创建一个 Handler 对象,并重写其 handleMessage() 方法;
--当子线程中需要操作 UI 时,就创建一个 Message 对象,并通过创建的 Handler 对象将其发送出去;
--发送的 Message 会被添加到 MessageQueue 队列中等待被处理;
--而 Looper 则会一直尝试从消息队列中去取出消息,最后分发给 Handler 对象的handleMessage() 进行处理;
--在 handlerMessage() 方法中可以随意操作 UI, 从而达到目的;
二、AsyncTask:一个异步消息处理的工具,使用更为方便,基本用法:
1)AsyncTask是一个抽象类,使用时需要创建一个子类来继承它;
2)在继承时我们可以为AsyncTask 类指定三个泛型参数,这三个参数的用途如下:
--Params:在执行 AsyncTask时需要传入的参数,可用于在后台任务中使用;
--Progress:后台任务执行时,如果需要在界面上显示当前的进度,则使用这里指定的泛型作为进度单位。
--Result:当任务执行完毕后,如果需要对结果进行返回,则使用这里指定的泛型作为返回值类型;
--例:
class DownloadTask extends AsyncTask<Void, Integer, Boolean> {
……
}
3)需要重写 AsyncTask 中的几个方法才能完成对任务的定制:
--onPreExecute():这个方法会在后台任务开始执行之前调用,用于进行一些界面上的初始化操作;
--doInBackground(Params...):这个方法中的所有代码都会在子线程中运行,所有的耗时任务都应该在这里进行处理。任务一旦完成就可以通过return 语句来将任务的执行结果返回。这个方法中不能进行 UI 操作,如果需要更新UI 元素,可以调用publishProgress(Progress...)方法来完成;
--onProgressUpdate(Progress...):当在后台任务中调用了publishProgress(Progress...)方法后,此方法被调用,方法中携带的参数就是后台任务中传递而来的,在此方法中可以对 UI 进行操作;
--onPostExecute(Result):当后台任务执行完毕并通过return 语句进行返回时,此方法被调用,返回的数据会作为参数传递到此方法中,可以利用返回的数据来进行一些UI 操作;
4)创建完毕 AsyncTask 对象之后只需要调用其 execute() 方法即可启动任务;
5)总结:
--在doInBackground()方法中去执行具体的耗时任务;
--在onProgressUpdate()方法中进行UI 操作;
--在onPostExecute()方法中执行一些任务的收尾工作。