众所周知Android网络访问是不允许在MainThread中运行的。所以我们的发送消息必须是多线程的,为了方便管理发送队列的稳定可靠必须设计一套可靠的发送messagequeue。
1.消息发送状态的定义
public enum MsgSendStatus {
draft,send, fail, success;
}
2、BindService 将长连接的Service调到前台来
bindService()
3.发送消息
调用发送消息:通过bindService获取到的service 调用 sendPacket实现发送消息。
为每个packet产生一个 uuid码,做到包裹的唯一区分。
mBinder.getService().sendPacket(user, message, null, id, new SendPacketListener(){
@Override
public void onFinish(String command, int result, String packet) {
if(result >0 ){
startActivity(new Intent(MatchmakerActivity.this,MatchmakerResultActivity.class));
finish();
}
}
});
发送过程
/**
* 发送 包体
* @param to
* @param packet
* @param state 可以为null 不需要状态 如果为编辑 composing 状态 packet==null
* @param command
* @param listener
*/
public synchronized void sendPacket(String to,String packet,ChatState state,String command,SendPacketListener listener){
VPLog.d(TAG, "to:"+to +" packet:"+packet);
to = to+"";
VpSendPacket vpPacket = new VpSendPacket(to,packet,state,command,listener);
SendPacketRun sendRun = new SendPacketRun(vpPacket) {
@Override
public void run() {
if (mConnection!=null && mConnection.isConnected() && mConnection.isAuthenticated()) {
VPLog.d(TAG, ""+mVpPacket);
if (mVpPacket.to.indexOf("@")<0) {
mVpPacket.to += "@"+SERVICE_NAME;
}
Chat chat = mChatManager.createChat(mVpPacket.to, null);
android.os.Message osmsg = new android.os.Message();
osmsg.obj = mVpPacket;
osmsg.what = SEND_PACKET;
try {
Message chatMessage = new Message();
chatMessage.setBody(mVpPacket.packet);
if (mVpPacket.mChatState!=null) {
chatMessage.addExtension(new ChatStateExtension(mVpPacket.mChatState));
}
chat.sendMessage(chatMessage);//发送消息
mVpPacket.result = 1;
} catch (Exception e) {
e.printStackTrace();
mVpPacket.result = -1;
}finally{
if (chat!=null) {
chat.close();
}
}
mhHandler.sendMessageDelayed(osmsg, 10);//成功
VPLog.d(TAG, ""+mVpPacket);
}else { //没有登录,去登陆
login();
android.os.Message osmsg = new android.os.Message();
osmsg.obj = mVpPacket;
osmsg.what = SEND_PACKET;
mVpPacket.result = -1;
mhHandler.sendMessage(osmsg);
}
}
};
if (mExecutorService==null) {
mExecutorService = Executors.newSingleThreadExecutor();//单例的线程池
}
mExecutorService.submit(sendRun);
}
详解:为了让多线程的操作能够有序化,我们建立一个单例的线程池来完成所有的异步操作,这样可以确保有序的进行。
if (mExecutorService==null) {
mExecutorService = Executors.newSingleThreadExecutor();//单例的线程池
}
回调的处理:通过Hnadler 将Thread中的结果同步到MainThread中。
在Handler中对 Packet中的 SendPacketListener进行调用 OnFinish()。
mhHandler.sendMessageDelayed(osmsg, 10);//成功
VPLog.d(TAG, ""+mVpPacket);
......
public Handler mhHandler = new Handler(){
public void handleMessage(android.os.Message msg) {
switch (msg.what) {
case SEND_PACKET: //发送包裹
if (msg.obj!=null && msg.obj instanceof VpSendPacket) {
VpSendPacket vpSendPacket = (VpSendPacket) msg.obj;
if (vpSendPacket.mSendPacketListener!=null) {
vpSendPacket.mSendPacketListener.onFinish(vpSendPacket.command, vpSendPacket.result, vpSendPacket.packet);
}
};
break;
.....
};

本文介绍了一种Android应用中实现稳定可靠消息发送的方法。通过定义消息状态、使用单例线程池管理发送队列,并结合Handler机制同步主线程更新,确保了消息发送过程的异步性和回调结果的准确性。
2628

被折叠的 条评论
为什么被折叠?



