次のシナリオでの最善/優れたサービスバインディング/コミュニケーションプラクティスは何ですか (タイトルがある程度意味のあるものであることを願っています):
非同期ソケット サービス (SS) を (共通の通信エンドポイントとして) 共有するいくつかのサービス メソッドを含むビジネス レイヤー (BL)。これらのメソッドによってバインドされ、ソケット 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 の 1 つは、実装する 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 内の認証トークンをリクエストした場合、結果を返すにはどうすればよいでしょうか?
ここでの主な問題は、結果が呼び出し元のメソッド (addAccount()) ではなく、messengerReceiver ハンドラーに返されることです。
私が考えることができる唯一の方法は、メッセージ ハンドラーによって応答が提供され、その後 addAccount() メソッド内で取得される BlockingQueue ですが、これは非常に不快に感じます。他のアイデア?正しいアプローチですか?