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方法进行线程间的通信。
通信的示意图如下,