Как обновлять модель с RxJava в Android?

Хабр полон статьями про счастье с rxJava и MVP, где мы ассинхронно грузим модель из удаленного хранилища (файловая система, сервер). Но совершенно отсутствует описание того, как эта модель меняется в ответ на действия пользователя.

Пример, https://habrahabr.ru/company/rambler-co/blog/277003/. Описание архитектурного подхода VIPER. Сам VIPER я не использую, но в нем используется MVP, а в примере рамблера еще и rxJava. В статье описано приложение, которое выводит на экран сообщения, которые откуда-то грузит. Но написать сообщения нельзя, модель откуда-то появляется, но пользователь не в силе на нее повлиять. А ее еще нужно сохранить в базу. А если в модели у нас есть некоторые взаимоотношения между сущностями и мы можем словить ConcurrentModificationException, если в разных потоках у нас будут работать несколько Interactor`ов.

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

Допустим, у нас есть список некоторых элементов - маркеров, которые пользователь может включить или выключить для отображения на карте (некоторое навигационное приложение) - у каждой строки есть свитч. Кроме маркеров, в моделе есть большое количество других сущностей (тоже гео-объектов), и их очень много. Чтобы UI был отзывчив, менять модель нужно в отдельном потоке. Для этого я сделал свой Scheduler, который назвал DATA_SCHEDULER.

Вроде все просто - Presenter запрашивает у MarkerStore Observable> - markerObservable, после получения списка передает его на отображение в MarkerListFragment. У каждого Marker есть поле visible, в зависимости от которого свитч либо on либо off. Что происходит, когда юзер кликает по свитчу - тот должен переключиться, и в DATA_SCHEDULER отправляется событие, о том, что поле visible нужно поменять. Операция довольно быстрая, мы очень скоро получаем апдейт модели в markerObservable, где у конкретного маркера поле visible поменяло значение. Но что если DATA_SCHEDULER загружен? Или пользователь начнет барабанить по свитчу? В очереди появится много запросов на изменение поля visible, которые будут дергать его туда сюда, после которых будут валиться апдейты в markerObservable.

Это вымышленный пример, но он описывет боль, которую я испытываю. Думаю, не у меня одного возникали такие проблемы, и хотелось бы посмотреть на возможные решения. Или примеры более реальных приложений, которые используют mvp и rxJava, и работают с более реальной моделью чем большинство примеров "чистой архитектуры" на хабре. Сам я гуглил, но ничего не нагуглил.
  • Вопрос задан
  • 468 просмотров
Решения вопроса 1
@zoopolitic
Вы всегда можете использовать debounce на случай если пользователь барабанит по свичу без перерыва. Не вижу таких условий при которых ваш scheduler будет загружен настолько, чтобы были задержки при обраотки ui событий. Но если у вас действительно какая-либо высоконагруженная система, используйте ThreadPoolExecutor, тем более rxJava позволяет с легкостью создать scheduler на базе экзекутора: Schedulers.from(Executor)
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы