Size: a a a

Android Architecture

2020 May 28

Q

QMan in Android Architecture
Ivan Andreyshev
Часто в примерах встречаю, что VM берет подписки на базу данных и отображение происходит данных из бд. При этом если какой-то UseCase модифицирует БД (не на прямую, конечно). То экран изменяется из-за получения новых данных из вышеупомянутых подписок.

Бывают примеры приложений, где моделью является не БД, а какие-то классы, объекты, находящиеся в памяти?
С появлением flow всё стало гораздо проще, так как это не архитектурный компонент и может спокойно прокидываться в бизнес-слой
источник

T

Tepex in Android Architecture
А если с недавним StateFlow, то прощай LiveData))
источник

Q

QMan in Android Architecture
Да
источник

IA

Ivan Andreyshev in Android Architecture
QMan
С появлением flow всё стало гораздо проще, так как это не архитектурный компонент и может спокойно прокидываться в бизнес-слой
Вопрос больше про подход в целом, не имеет значения, какая библиотека используется для подписок.
источник

Q

QMan in Android Architecture
Ivan Andreyshev
Вопрос больше про подход в целом, не имеет значения, какая библиотека используется для подписок.
Как это не имеет ? Еще как имеет. А что подход ?
источник

T

Tepex in Android Architecture
Ivan Andreyshev
Вопрос больше про подход в целом, не имеет значения, какая библиотека используется для подписок.
Имеет в том смысле, что следует избавляться от Андроид-зависимостей.
источник

Q

QMan in Android Architecture
У вас одна точка для входа/выхода данных, а там хоть файл, хоть бд, хоть memory без разницы
источник

АЕ

Алексей Ершов... in Android Architecture
Человек спрашивает про гонки а вы ему про андроид зависимости, он из другой дискуссии, не про вьюмодели)
источник

Q

QMan in Android Architecture
Просто оборачиваете своё хранилище в flow и всё
источник

Q

QMan in Android Architecture
произошли изменения в хранилище ? emit
источник

Q

QMan in Android Architecture
запросили данные ? emit
источник

Q

QMan in Android Architecture
и т.д.
источник

IA

Ivan Andreyshev in Android Architecture
Меня больше интересует, что emit / onNext / postValue (опять же не важно какая либа) может происходить не сразу
То есть во время выполнения UseCase`а произошла модификация хранилища - подписки получат новые данные не моментально, скорее всего в другом потоке и, скорее всего, чуть позже

Вот пока они получают свои данные юзер может накликать, в теории, много раз по старым данным на экране -> запустятся новые UseCase`ы

@alaershov , понятно, что я имею ввиду?)
источник

АЕ

Алексей Ершов... in Android Architecture
я бы сказал что в любом случае обеспечение консистентности данных это задача их хранилища, будь то БД или in-memory что-то. В конечном итоге ваша корутина дойдет по цепочке вызовов до этого хранилища, и вот там уже надо будет решать, как обеспечить консистентность. К счастью корутина это всё-таки не поток, и все методы модификации данных можно сделать suspend и внутри сделать синхронизацию.
источник

Q

QMan in Android Architecture
Ivan Andreyshev
Меня больше интересует, что emit / onNext / postValue (опять же не важно какая либа) может происходить не сразу
То есть во время выполнения UseCase`а произошла модификация хранилища - подписки получат новые данные не моментально, скорее всего в другом потоке и, скорее всего, чуть позже

Вот пока они получают свои данные юзер может накликать, в теории, много раз по старым данным на экране -> запустятся новые UseCase`ы

@alaershov , понятно, что я имею ввиду?)
сделайте невозможным клик
источник

АЕ

Алексей Ершов... in Android Architecture
Если мы говорим о том, что пользователь может на основе старых данных сделать много запросов, и после исполнения первого из них остальные станут неактуальны - опять же, задача вашего хранилища данных сделать так, чтобы остальные запросы не попортили ничего. Ну и да, можно пользователю попытаться блокировать UI, однако это уже скорее для удобства, не для защиты.
источник

IA

Ivan Andreyshev in Android Architecture
Алексей Ершов
Если мы говорим о том, что пользователь может на основе старых данных сделать много запросов, и после исполнения первого из них остальные станут неактуальны - опять же, задача вашего хранилища данных сделать так, чтобы остальные запросы не попортили ничего. Ну и да, можно пользователю попытаться блокировать UI, однако это уже скорее для удобства, не для защиты.
Да, вот то что я пытаюсь разобрать. Где эта защита должна быть, пока не понятно
источник

АЕ

Алексей Ершов... in Android Architecture
Вы всё равно обсуждаете общий вопрос. Он сложный, лучше взять конкретную задачу, где вы видите, что без этой защиты всё ломается, и её разобрать.
источник

Q

QMan in Android Architecture
В room имеется, если выполнять через транзакции
источник

АЕ

Алексей Ершов... in Android Architecture
У меня был один опыт, где нужно было прям думать об этом, собственно, синхронизация с сервером локальной модели данных. И там я руками делал логику, что пока мы грузим данные на сервер, никто локальную модель не может изменять. Если запущено несколько синхронизаций для разных объектов (юзер накликал), то они клались в очередь, и исполнялись строго последовательно, и с дополнительными проверками, типа а нужно ли вообще нам это делать.
источник