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

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方法进行线程间的通信。

通信的示意图如下,


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值