Невозможно тост за поток, который не вызвал, RxJava2

У меня есть такой код:

compositeDisposable.add(RetrofitClient
            .getApi()
            .getData()
            .flatMap(response -> {
                Data data;
                if (response.isSuccessful()) {
                    data = response.body();
                    //insert data to database
                    Database.getInstance(context)
                            .getDao()
                            .insert(data);                     
                } else {
                    ResponseBody responseBody = response.errorBody();
                    if (responseBody != null) {
                        data = new Gson().fromJson(responseBody.charStream(), Data.class);
                    }
                }
                return Observable.just(data);
            })
            .onErrorResumeNext(throwable -> {
            //get data from database                   
                Data data = Database.getInstance(context).getDao().getData();
                return Observable.just(data);
            })
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .retryWhen(throwableObservable ->
                    throwableObservable.take(1).delay(1, TimeUnit.SECONDS))
            .doOnTerminate(view::hideScreenLoader)
            .subscribe(this::showData, throwable -> {
                Toast.makeText(context,
            throwable.getMessage(), Toast.LENGTH_LONG).show();
            }));

Я не могу понять, почему иногда пользователи получают эту ошибку: «Вызвано java.lang.RuntimeException. Невозможно создать тост в потоке, который не вызвал Looper.prepare ()».

Тост должен быть вызван в основном потоке, спасибо.

Toast - это элемент пользовательского интерфейса, и его нужно вызывать из основного потока приложения.

karan 12.10.2018 04:42

Я знаю это, но что не так, я не могу понять, у меня есть: ".observeOn (AndroidSchedulers.mainThread ())", в котором говорится, что результат будет работать в основном потоке.

Sawyerhard 12.10.2018 04:44

ваш метательный предмет может работать на отдельном тераду. используйте System.out.println(Thread.currentThread().getName());, чтобы проверить, в каком потоке он работает.

karan 12.10.2018 04:49

@KaranMer, о, там написано: "RxComputationThreadPool-1"

Sawyerhard 12.10.2018 05:00

попробуйте использовать new Observer () с подпиской, и вы можете отслеживать ошибки

karan 12.10.2018 05:03

возможно, я решил эту проблему, я нашел эту тему -> stackoverflow.com/questions/39835978/…, я должен смахнуть «retryWhen» и наблюдатьOn, потому что «retryWhen» имеет функцию задержки, которая переключается на поток вычислений :)

Sawyerhard 12.10.2018 05:07

Попробуй, удачи в этом ...

karan 12.10.2018 05:08
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
7
289
1

Ответы 1

В этой теме нашел решение: как обрабатывать ошибки RxAndroid в основном потоке;

Необходимо поменять местами «retryWhen» и «detectOn», потому что retryWhen имеет «функцию задержки», которая переключает на вычислительный поток :)

Другие вопросы по теме