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一起使用,您可以监视错误