169 похожих чатов

Всем привет! Ребят, подскажите, пожалуйста. Приложение получает от сервера жсон

и выводит его в RecyclerView. При наличии сети данные жсона при помощи Room сохраняются в базу данных, чтобы потом при отсутствии сети показаться пользователю.

В onCreateView() вызываем viewModel.getPokemons(). Там try-catch блок, в нём делаем запрос к серверу. Если сеть есть, выполняется try, парсит жсон и сохраняет данные в БД.
При отсутствии сети выполняется catch блок, где я и столкнулся с проблемой, потому что список оказывается равным null.

В строке 46 я беру список из базы данных и присваиваю его pokemonList.
Я правильно понимаю, что список равен null в момент использования его адаптером из-за метода postValue, потому что postValue срабатывает уже после присваивания адаптера, до тех пор он null?

И обычный setValue я не могу использовать, потому что дело происходит в корутине. А без корутины не обойтись, потому что чтение из БД должно происходить не в главном потоке. Вот такой порочный круг, как из него выйти?

15 ответов

15 просмотров

работая с лайвдатой в саспенд функциях нужно использовать postValue(), а не просто value. Пост гарантирует нормальную работу в разных потоках строки 41 и 43

Azat-Nabiullin Автор вопроса
Savva Mirzoyan
работая с лайвдатой в саспенд функциях нужно испол...

Да, но при отсутствии сети эти строки вообще не выполняются и код уходит в catch блок, где я как раз использую postValue и это не работает. При наличии сети все значения выводятся корректни и ретрофит берет данные с сервера. Проблема именно при отсутствии сети

1. Может данные в репозитории на самом деле null? В таком случае сделайте проверку, если они null тогда передайте просто пустой список, аля emptyArrayList(). Проверить это можно с помощью дебагера я думаю... 2. Почему используете runBlocking вместо lifecycleScope.launch { }

getPokemonsFromDatabase() покажите метод

Azat-Nabiullin Автор вопроса
Savva Mirzoyan
getPokemonsFromDatabase() покажите метод

Первый скрин. На втором DAO.

не знаю, на сколько это правильно, но я обычно в репозитории делаю запрос на Dispatchers.IO, а во вью модели уже работаю в viewModelScope на главном потоке - при вызове метода из репозитория у тебя по идее сам запрос на ИО поток уйдет

Azat-Nabiullin Автор вопроса

Данные в репозитории не null, и если например запустить такую функцию, то выводится List со всеми данными. Просто с этой postValue данные списку присваиваются уже после использования его адаптером. По этой причине я в отчаянии использовал runBlocking - думал, что пусть все потоки заблокируются, значение списку присвоится, а потом уже адаптер его использует. Не помогло.

Azat Nabiullin
Первый скрин. На втором DAO.

у вас метод в ДАО не саспенд

Azat Nabiullin
Данные в репозитории не null, и если например запу...

попробуйте рефактор кода по примеру того как предложил Сергей. Это избавит вас от необходимости использовать postvalue

Azat Nabiullin
Данные в репозитории не null, и если например запу...

хз, попробуй сделать так - в репозитории возвращай withContext(Dispatchers.IO) {// запрос к бд тут}, и во вью модели используй value

Savva Mirzoyan
у вас метод в ДАО не саспенд

ну и в репозитории, соответственно

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

Обсуждают сегодня

Какой-то там пердун в 90-х решил, что есть какая-то разная типизация. Кого вообще это волнует?
КТ315
49
void terminal_scroll() { memmove(terminal_buffer, terminal_buffer + VGA_WIDTH, buffer_size - VGA_WIDTH); memset(terminal_buffer + buffer_size - VGA_WIDTH, 0, VGA_WIDTH); ...
Егор
47
Всем привет! Подскажите, пожалуйста, в чем ошибка? Настраиваю подключение к MySQL. Либы лежат рядом с exe. Все как по "учебнику"
Евгений
16
А можете как-то проверить меня по знаниям по ассемблеру?
A A
132
Здравствуйте! У меня появилась возможность купить книгу "Изучай Haskell во имя добра!". Но я где-то слышал, что эта книга устарела. Насколько это правда??
E
22
Здравствуйте! Я вот на stepic решаю задачи на хаскеле https://stepik.org/lesson/8443/step/8?unit=1578 мой код import Data.List (isInfixOf) removing :: String -> [String] ->...
E
10
Камрады, кто тесно работал с vtv, хотел уточнить. Ширина column задаётся жёстко на этапе создания дерева или можно в рантайме ее менять программно (не мышкой)?
Ed Doc
10
да ладно ... что там неочевидного ? глянуть в исх-ки датасета и/или кверика чтобы понять в каком месте и как выполняется обращения к св-вам blablaSQL - минутное дело, даже е...
Сергей
7
Здесь для arm кто-нибудь кодит ?
Nothing
52
Всем привет, у меня есть сервер принимающий входящие HTTP подключения, как проверить, что подключение было через прокси или нет, есть какие то поля в заголовках по которым мо...
DS
8
Карта сайта