【发布时间】:2018-10-12 11:14:10
【问题描述】:
我有这个代码:
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();
}));
我不明白为什么有时用户会收到此错误:“Caused by java.lang.RuntimeException Can't toast on a thread that has not called Looper.prepare()”。
Toast 必须在主线程调用,谢谢。
【问题讨论】:
-
Toast 是一个 ui 元素,你需要从应用程序主线程调用它。
-
我知道,但有什么问题,我不明白,我有:“.observeOn(AndroidSchedulers.mainThread())”,也就是说,结果将在主线程工作
-
您的 throwable 可能在单独的线程上运行。使用
System.out.println(Thread.currentThread().getName());来检查它在哪个read 上工作。 -
@KaranMer,哦,上面写着:“RxComputationThreadPool-1”
-
尝试使用 new Observer() 订阅,您可以监控错误
标签: java android android-toast