Как сделать хранение данных в памяти между разными активити с возможностью observe?
Вот у нас есть активити с неким списком. Который пользователь может редактировать. Стало быть, архитектура такая: List (в нем лежат данные), RecyclerView и RecyclerView.Adapter.
Кроме того, есть возможность сохранять данные в shared preferences и подгружать их оттуда. Подгружаем мы в onCreate, а для сохранения у нас есть функция, которую мы дергаем из обсервера адаптера, чтобы точно дернулось при любых изменениях. Сохраняет она только не-transient поля моделей.
Все прекрасно. Но, при нажатии на каждый элемент списка должна открываться уже другая активити. На которой к тому же есть кнопка "Скачать" (файл). И по этой кнопке начинается скачивание. И вот результат этого скачивания должен отображаться как в этой активити, так и в активити списка (в этом элементе списка).
И тут непонятно, как быть. Я, конечно, могу вообразить, что Adapter дает и такую возможность. Сделать специальный класс InMemoryDB и положить адаптер в публичное статическое поле этого класса. И сам объект List тоже положить в такое же поле. И дергать их из обеих активити спокойно. И даже в классе InMemoryDB написать какие-то хелперы, чтобы эти дергания сделать более DRY и меньше был риск допустить ошибку.
Но все равно же спагетти, и чувствуется, что я забиваю гвозди микроскопом, наваливаю на инструмент (Adapter) тот функционал, к которому он не приспособлен. Хотя бы потому. что Adapter - это RecyclerView.Adapter, а я из него с таким же успехом сделаю хранилище данных, которые вообще нигде не отображаются в RecyclerView.
при нажатии на каждый элемент списка должна открываться уже другая активити
так никто не делает, все работают с сингл активити
ну и вообще где код твоего варианта?
А как правильно?
нет никакого "правильного" ответа
общую вьюмодель можно использовать, а вообще зависит от твоей архитектуры и что ты там используешь для асинхронщины и прочего
А что тут такого, что аж код нужен?
Юзаю registerAdapterDataObserver. Все очевидно.
так никто не делает, все работают с сингл активити
Да? Все открывают диалоговые окна? Явно нет. Бывает, что в диалоговое окно просто не влезет куча данных.
Или хочешь сказать, что все используют единое активити и в нем фреймы? Ну так у них тогда возникнут сложности с аппбаром - придется как-то заставлять его показывать стрелочку "назад", когда открыт фрейм с конкретным элементом списка. И зачем так усложнять?
Ну так у них тогда возникнут сложности с аппбаром - придется как-то заставлять его показывать стрелочку "назад", когда открыт фрейм с конкретным элементом списка.
и вот это еще не понял, что это за мифические сложности?
beem7, хватит тупить, взаимодействие с диском, сетью должны быть в другом потоке, тем более если нужно чтобы загрузка сработала после закрытия "активити" и продолжило грузиться чтобы загрузиться на предыдущем "активити"
можно в те же префы сохранять инфу об успехе, и на первом фрагменете проверять их, можно через setResult передать значение
В общем ты пытаешься умничать, но в основном несешь полную дичь еще и ответить нормально на вопросы не можешь
Jacen11, чудик, как ты представляешь себе работу с сетью в потоке UI, если Android давным-давно это не позволяет?)))
А если никак, то зачем ты мне пишешь, что не надо это делать в потоке UI?)))
За оскорбления вообще модератору пожалуюсь.
В общем тебе всё правильно сказали про single activity. Должны быть очень веские основания для того, чтобы использовать больше одной активити. Внутри всё разруливается фрагментами или их аналогами.
Теперь, когда ты перейдешь на фрагменты, можно между ними нормальный di сделать, и не запариваться.
Адаптер нужен только для отображения данных в ui, всё, больше он ничего делать не должен.
См паттерн Repository.