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

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

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

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

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

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

15 ответов

18 просмотров

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

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

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

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

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
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
в JclConsole объявлено так: function CtrlHandler(CtrlType: DWORD): BOOL; stdcall; - где ваше объявление с stdcall? у вас на картинке нет stdcall
Karagy
8
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
~ 2m21s  nix shell github:nixos/nixpkgs#stack ~  stack ghc -- --version error: … while calling the 'derivationStrict' builtin at /builtin/derivation.nix:...
Rebuild your mind.
6
Карта сайта