Как показано в этом блоге Mind The Robot , автор предполагает, что контроллер получает свои сообщения из View через обработчик, например:
inboxHandlerThread = new HandlerThread("Controller Inbox"); // note you can also set a priority here
inboxHandlerThread.start();
// ... some code omitted ...
inboxHandler = new Handler(inboxHandlerThread.getLooper()) {
@Override
public void handleMessage(Message msg) {
Controller.this.handleMessage(msg);
}
};
// from the View
controller.getHandler.sendEmptyMessage(Controller.HANDLE_UPDATE);
Из-за асинхронностиМетод и обработчик sendMessage считают этот подход проблематичным в Android.Если я хочу создать настоящий контроллер, мне нужно делегировать методы контроллера в Activity, такие как логическое dispatchKeyEvent (событие KeyEvent).Однако, поскольку обработчик асинхронный, я не знаю, был ли обработан KeyEvent на самом деле, и не могу вернуть соответствующее значение.
Вместо этого я решил передать свои события из представления, просто вызвав метод на контроллере, например
boolean sendMessage(int what);
boolean sendMessage(int what, Object data);
Таким образом, я могу сразу получить соответствующее возвращаемое значение от моего контроллера, и есликонтроллер должен обрабатывать их асинхронно, он может прозрачно, и я все еще могу получить ответ, что сообщение будет обработано либо сейчас, либо в будущем.
Мой вопрос: Какое преимущество у подхода MindTheRobot, использующего
controller.getHandler.sendEmptyMessage(Controller.HANDLE_UPDATE);
, над чем-то вроде
controller.sendMessage(Controller.HANDLE_UPDATE);
?
Я не вижу никаких преимуществ, и мне даже кажется, что он нарушает инкапсуляцию и раскрывает внутренности этого класса без необходимости.
РЕДАКТИРОВАТЬ: Хорошо, что-нибудь попроще.Какой подход вы, ребята, используете для отправки сообщений из ваших представлений на контроллеры?