Android--异步消息处理机制

一、异步消息处理机制:

  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()方法中执行一些任务的收尾工作。

posted on 2016-03-16 14:53  _taoGe  阅读(193)  评论(0编辑  收藏  举报