以下场景中最好/好的服务绑定/通信实践是什么(希望标题有点意思):
业务层 (BL) 包括多个服务方法,这些服务方法共享(作为公共通信端点)异步套接字服务 (SS),该服务可以由这些方法绑定并用于套接字 IO。
例如,BL 抓取 SL 并调用 send(message),然后等待响应。
我一开始使用回调和活页夹模式。由于我在使用活页夹模式进行清晰设计时遇到了一些问题(缺少消息队列并且一切都在主线程中完成),我现在正在尝试消息模式。
所以基本上,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) {
...
}
}
其中一个 BL 是 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() 方法要么要求立即在 Bundle 中返回结果(authToken),要么调用响应回调方法。现在,如果我通过 SL 请求 addAccount 中的身份验证令牌,我将如何处理以传回结果?
这里的主要问题是结果不是返回给调用方法 (addAccount()) 而是返回给 messengerReceiver 处理程序。
我能想到的唯一方法是 BlockingQueue,它由消息处理程序提供响应,然后在 addAccount() 方法中获取,但这确实让人感觉非常糟糕。其他想法?正确的方法吗?