android AsyncChannel机制 --- 异步消息分析

来源:互联网 发布:苹果系统切换windows 编辑:程序博客网 时间:2024/05/22 10:37

2 异步消息分析

客户端一般调用sendMessage方法发送异步消息,

sendMessage方法如下,

mClientAsyncChannel.sendMessage(MSG_ASYNC_REQ);

MSG_ASYNC_REQ是一个int值,

客户端的AsyncChannel对象的sendMessage方法如下,

public void sendMessage(int what) {    Message msg = Message.obtain();    msg.what = what;    sendMessage(msg);}

构造成一个消息,调用sendMessage发送给服务端, sendMessage方法如下,

public void sendMessage(Message msg) {     msg.replyTo = mSrcMessenger;     try {         mDstMessenger.send(msg);     } catch (RemoteException e) {         replyDisconnected(STATUS_SEND_UNSUCCESSFUL);  }}

mDstMessenger是指向服务端的Messenger对象,

mSrcMessenger是指向客户端的Messenger对象。这2个对象始终要搞清楚。

因此sendMessage方法首先将Message对象的replyTo对象设为客户端的Messenger对象,然后调用服务端的Messenger对象

发送该消息,也就是发送到服务端所在的包含服务端的Messenger对象的handler子线程,这一段话说起来拗口。

一般服务端的子线程的Handler的handleMessage处理该消息,一般格式如下,

case MSG_ASYNC_REQ: {    Message reply = msg.obtain();    reply.what =MSG_ASYNC_REPLY;    reply.obj = "•••"; //服务端发送给客户端的响应结果。    try {         msg.replyTo.send(reply);    } catch (RemoteException e) {    }    break;}

首先获取Message 的replyTo对象,在客户端的AsyncChannel中设置为客户端的Message对象,然后调用send方法发送到客户端。

客户端一般处理如下,

case MSG_ASYNC_REPLY: {String msg = (String) message.obj;//获取响应结果•••    break;}

这样,消息流从客户端到服务端,最后又到了客户端。

单通道Message通信的本质就是:

客户端的AsyncChannel对象持有客户端和服务端的Message对象,通过Message对象的replyTo变量和send方法进行线程间的通信。

通信的示意图如下,


原创粉丝点击