2 голоса
 
111 просмотров
21.12.2020 / 00:47  aNNiMON

Организация связи между классами в Android без Listener/Callback

Есть TimelineView, в котором происходит нечто наподобие редактора; MainActivity, который этим TimelineView управляет, вызывая действия (new, undo, redo). И есть специализированные команды, которые можно представить как инструменты.
https://i.imgur.com/Hi93BoZ.png

Для простых действий, таких как например new, проблем нет: пользователь выбирает пункт меню, в обработчике этого пункта в MainActivity просто вызываем timeline.actionNew() и получаем результат с минимальным кодом.

Но в случае с undo/redo появляются сложности. Во-первых, в классах Command нужно вызвать commitInHistory() непосредственно перед самим изменением. Этот метод должен взять из класса TimelineView данные (или сообщить ему это сделать) и сохранить их в UndoHistory. Во-вторых, нужно включить/выключить пункт меню undo/redo в MainActivity в зависимости от доступности отмены/возврата.
  1. // 1
  2. class Cut extends Command {
  3.   void applyCommand() {
  4.     prepare();
  5.     commitInHistory();
  6.     timeline.data.cut();
  7.   }
  8. }
  9.  
  10. // 2
  11. class MainActivity {
  12.    ...
  13.    undo.setEnabled(!timelineView.getUndoHistory().isEmpty());
  14.    undo.setOnClickListener(v -> timelineView.undo());
  15. }


Делать всё на листенерах — плохая идея, потому что ими будет сложно управлять. Кроме того, текущая команда в TimelineView может меняться (поле currentCommand). Снимать/ставить обработчики при каждом переключении команды тоже непросто.

Как вариант, можно использовать EventBus. Но не понятно, как быть со сменой команд (не будет ли утечек памяти?). И, если когда-нибудь понадобится отправить событие и сразу же получить ответ от UI, справится ли EventBus с этим? Например, при выборе пункта меню Undo, послать событие onUndo и тут же вернуть результат успешности отмены или количества записей в истории, чтобы решить, стоит ли выключить этот пункт.

Что можно ещё использовать для такого сценария?
21.12.2020 / 16:04  Ксакеп
Так а какой вопрос?
Ответы
Ответов нет
Всего: 0

Реклама

Мы в соцсетях

vk tw tg yt