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

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

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

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

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

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

15 ответов

19 просмотров

работая с лайвдатой в саспенд функциях нужно использовать 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
у вас метод в ДАО не саспенд

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

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

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

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта