【发布时间】:2012-04-12 16:07:56
【问题描述】:
以下场景中最好/好的服务绑定/通信实践是什么(希望标题有点意思):
一个业务层 (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() 方法中获取,但这真的感觉非常难看。 其他想法?方法是否正确?
【问题讨论】:
标签: android binding service design-patterns messenger