我有此代码:
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()的线程上进行烘烤”。
吐司必须在主线程调用,谢谢。
答案 0 :(得分:1)
我在以下主题中找到了决定:how to handle RxAndroid errors in the main thread;
需要交换“ retryWhen”和“ observeOn”,因为retryWhen具有“ delay function”,因此切换到计算线程:)