Can';t toast在未调用RxJava2的线程上
我有以下代码:Can';t toast在未调用RxJava2的线程上,java,android,android-toast,Java,Android,Android Toast,我有以下代码: compositeDisposable.add(RetrofitClient .getApi() .getData() .flatMap(response -> { Data data; if (response.isSuccessful()) { data = response.body();
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”
吐司必须在主线程调用,谢谢。我在这个主题中找到了决定:
需要交换“retryWhen”和“observeOn”,因为retryWhen有“延迟函数”,可以切换到计算线程:)Toast是一个ui元素,您需要从应用程序主线程调用它。我知道,但有什么不对,我不明白,我有:“.observeOn(AndroidSchedulers.mainThread()”,也就是说,这一结果将在主线程工作,您的throwable可能在单独的therad上运行。使用
System.out.println(Thread.currentThread().getName())
检查读卡器的工作状态。@KaranMer,哦,它说:“RxComputationThreadPool-1”尝试将new Observer()与subscribe一起使用,您可以监视错误