异步消息处理机制

来源:互联网 发布:恋爱循环的镜头数据 编辑:程序博客网 时间:2024/04/28 17:19

异步消息处理机制经常会被使用到,在Android中主要由四个部分组成:Message、Handler、MessageQueue、Looper,下面解释一下各个部分代表的含义

1、Message

用于在线程之间传递消息,可以在内部携带少量的信息,用于在不同线程之间交换数据,可以使用what、arg1、obj字段携带信息

2、Handler

用于发送和处理消息,发送是利用handler中的sendMessage()方法,而处理的方法为handleMessage()方法

3、MessageQueue

指的是消息队列 的意思,主要用于存放所有通过Handler发送的消息都会存在消息队列当中,等待被处理,每个线程只有一个MessageQueue对象

4、Looper

相当于MessageQueue的管家,调用Looper的loop()方法之后,就会进入一个无限循环中,只要发现MessageQueue中存在一条消息,就会将它取出,并传递到Handler中的处理方法去处理,每个线程中也只有一个Looper对象

将上面四个部分连接起来构成的一个机制就是,将带有Message字段的信息通过Handler发送出去,存放在MessageQueue队列当中,然后由Looper检测到后,就会被传递到Handler中去处理,这就是异步消息处理机制的原理


下面介绍通过上面的异步消息处理机制做成封装的一个工具AsyncTask,他的基本用法就是创建一个子类去继承它并重写对应的方法,继承的时候会指定三个参数,这三个参数的作用分别如下所示:

1、Params:在执行AsyncTask的时候需要出入的参数,可用于后台任务中使用,没必要的时候可以使用Void类型即可

2、Progress:后台任务执行时候的进度,通常我们显示为23%的形式,所以可以使用Integer类型

3、Result:后台任务执行完毕时返回的类型,通常我们使用Boolean类型来表示任务执行的成功或失败

注意:初次之外我们启动AsyncTask的方法是,创建继承AsyncTask的类的对象,并调用execute()方法即可启动

下面贴上代码例子:

class DownService extends AsyncTask<Void ,Integer ,Boolean>{    //后台任务开始之前被调用    @Override    protected void onPreExecute() {        Log.i("information","onpreExecute()");    }        @Override    protected Boolean doInBackground(Void... params) {        //这个方法里面的所有代码都是在子线程中运行的        Log.i("information","doInBackground()");        publishProgress(100);        return true;    }    //刷新进度    @Override    protected void onProgressUpdate(Integer... values) {        Log.i("information","onProgressUpdate()");    }    //任务执行完毕的时候被调用    @Override    protected void onPostExecute(Boolean aBoolean) {        if(aBoolean){            Log.i("information","onPostExecute()成功");        }else{            Log.i("information","onPostExecute()失败");        }    }}
启动的方法

new DownService().execute();


0 0