У меня есть такой код:
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 ()».
Тост должен быть вызван в основном потоке, спасибо.
Я знаю это, но что не так, я не могу понять, у меня есть: ".observeOn (AndroidSchedulers.mainThread ())", в котором говорится, что результат будет работать в основном потоке.
ваш метательный предмет может работать на отдельном тераду. используйте System.out.println(Thread.currentThread().getName());, чтобы проверить, в каком потоке он работает.
@KaranMer, о, там написано: "RxComputationThreadPool-1"
попробуйте использовать new Observer () с подпиской, и вы можете отслеживать ошибки
возможно, я решил эту проблему, я нашел эту тему -> stackoverflow.com/questions/39835978/…, я должен смахнуть «retryWhen» и наблюдатьOn, потому что «retryWhen» имеет функцию задержки, которая переключается на поток вычислений :)
Попробуй, удачи в этом ...




В этой теме нашел решение: как обрабатывать ошибки RxAndroid в основном потоке;
Необходимо поменять местами «retryWhen» и «detectOn», потому что retryWhen имеет «функцию задержки», которая переключает на вычислительный поток :)
Toast - это элемент пользовательского интерфейса, и его нужно вызывать из основного потока приложения.