Android MVC: отправка сообщений на контроллер - PullRequest
2 голосов
/ 15 ноября 2011

Как показано в этом блоге 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);

?

Я не вижу никаких преимуществ, и мне даже кажется, что он нарушает инкапсуляцию и раскрывает внутренности этого класса без необходимости.

РЕДАКТИРОВАТЬ: Хорошо, что-нибудь попроще.Какой подход вы, ребята, используете для отправки сообщений из ваших представлений на контроллеры?

1 Ответ

0 голосов
/ 03 июня 2015

Как представления, так и модели в архитектуре MVC должны быть написаны как отдельные, независимые компоненты.Контроллер, с другой стороны, может быть (и на практике обычно) подвергается деталям реализации как вида, так и модели.

Это означает, что если вы получили ссылку на контроллер MVC вваш взгляд на MVC (и я понимаю, что вы делаете) - ваш MVC несколько "сломан".Представление MVC не должно знать ничего о контроллере, который будет привязан к нему.

Один из способов сделать это - использовать Шаблон проектирования наблюдателя - заставить ваши контроллеры реализовать предопределенный интерфейс, в то время какпредставления позволяют наблюдателям регистрироваться для получения уведомлений.

Однако я думаю, что этот метод немного громоздок, поэтому я искал альтернативу. EventBus GreenRobot - просто сокровище в этом контексте - простое в использовании, быстрое и легкое.Попробуйте.

Я также создал учебное / шаблонное приложение MVP, которое демонстрирует один из подходов, которые вы можете использовать.Он использует вышеупомянутый EventBus для связи между компонентами.Исходный код здесь: https://github.com/techyourchance/android_mvc_template

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...