Не могу поднять тост в потоке, который не вызвал, RxJava2 - PullRequest
0 голосов
/ 12 октября 2018

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

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.подготовить()".

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

1 Ответ

0 голосов
/ 12 октября 2018

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

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

...