Android 服务间异步通信的最佳实践

Android 服务间异步通信的最佳实践,android,binding,service,design-patterns,messenger,Android,Binding,Service,Design Patterns,Messenger,在以下场景中,最佳/良好的服务绑定/通信实践是什么(我希望标题有点意义): 一种业务层(BL),包括多个服务方法,这些服务方法共享(作为公共通信端点)异步套接字服务(SS),该服务可由这些方法绑定并用于套接字IO 例如,BL获取SL并调用send(消息),然后等待响应 我首先使用回调和活页夹模式。由于我在使用活页夹模式进行清晰设计时遇到了一些问题(缺少消息队列以及在主线程中完成的所有工作),我现在尝试使用消息模式 基本上,BL服务和SL服务现在有一个Messenger和一个相应的处理程序: pr

在以下场景中,最佳/良好的服务绑定/通信实践是什么(我希望标题有点意义):

一种业务层(BL),包括多个服务方法,这些服务方法共享(作为公共通信端点)异步套接字服务(SS),该服务可由这些方法绑定并用于套接字IO

例如,BL获取SL并调用send(消息),然后等待响应

我首先使用回调和活页夹模式。由于我在使用活页夹模式进行清晰设计时遇到了一些问题(缺少消息队列以及在主线程中完成的所有工作),我现在尝试使用消息模式

基本上,BL服务和SL服务现在有一个Messenger和一个相应的处理程序:

private final IncomingHandler incomingHandler = new IncomingHandler();
private final Messenger messengerReceiver = new Messenger(incomingHandler);
private class IncomingHandler extends Handler {
  @Override
  public void handleMessage(Message msg) {
  ...
  }
}
其中一个BLs是一个AbstractAccountAuthenticator子类,实现

addAccount(AccountAuthenticatorResponse response, String accountType, String authTokenType, String[] requiredFeatures, Bundle options){
     ...
     if(socketConnectionState != null){
        Bundle authBundle = new Bundle();
        authBundle.putString("password", password);
        authBundle.putString("username", account.name);
        Message message = Message.obtain(null, SocketConnectionHandler.SEND_REQUEST, authBundle);
        message.replyTo = messengerReceiver;
        socketConnectionState.getMessenger().send(message);
...}
它还使用SL获取authToken。 addAccount()方法要求立即在捆绑包中返回结果(authToken),或者调用响应回调方法。 现在,如果我通过SL请求addAccount内的auth令牌,我将如何处理以传回结果

这里的主要问题是,结果不会返回给调用方法(addAccount()),而是返回给messengerReceiver处理程序

我能想到的唯一方法是一个BlockingQueue,它由消息处理程序提供响应,然后放在addAccount()方法中,但这确实让人感觉很难看。
其他想法?完全正确的方法?

只有在声明前提时,问题才会出现,响应是消息处理程序的问题

我最近在工作中也遇到了同样的问题。我们通过扩展消息处理程序的参数列表来解决这个问题

public interface MessageHandler {
    public void receivedMessage(Message message, ResponseChannel channel);
}

interface ResponseChannel {
    public void respond(Message response);
}

interface Message {}
当然,可以在
MessageHandler
的每个实例中引入一个成员变量,但这将消除无状态性——最后,这两种方法背后的原理是相同的

不过,还有另一种可能性

关注点分离 正如我在前面所说的,将应答响应的额外责任分配给消息处理程序会留下不好的印象。 消息处理程序已负责接收传入消息

他处理传入消息,这应该是一个提取相关参数并将消息转发给相关方或在模型或控制器上调用适当方法的短过程

它应该是一个简短且非穷举的过程,因为消息处理程序在逻辑上不是发送/接收组件的一部分,而是在那里注册的,并与所有其他消息处理程序及其调用共享一个线程或线程池

那么,我们应该如何处理回应呢?因此,如果这不属于经办人的责任,那么经办人通知的各方应该采取行动

public interface MessageHandler {
    public void receivedMessage(Message message, ApplicationContext context);
}

interface ApplicationContext {
    public void notifyUserJoined(String name);
}

interface Message {
    public String getUser();
}