Что лучше / хорошая практика привязки услуг / коммуникации в следующем сценарии (надеюсь, название несколько значимое):
Бизнес-уровень (BL), включающий несколько методов обслуживания, которые совместно используют (в качестве общей конечной точки связи) асинхронную службу сокетов (SS), которая может быть связана этими методами и используется для ввода-вывода сокетов.
например. 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 () либо требует немедленного возврата результата (authToken) в Bundle, либо вместо этого вызывает методы ответного обратного вызова.
Теперь, если я запрашиваю токен аутентификации внутри addAccount через SL, как мне обработать, чтобы передать результат обратно?
Основная проблема здесь заключается в том, что результат возвращается не вызывающему методу (addAccount ()), а обработчику messengerReceiver.
Единственный способ, которым я мог придумать, - это BlockingQueue, которому предлагается обработчик сообщения, и который затем принимается внутри метода addAccount (), но на самом деле это выглядит грубо.
Другие идеи? Правильный подход вообще?