【问题标题】:Can't toast on a thread that has not called, RxJava2无法在未调用的线程上敬酒,RxJava2
【发布时间】: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


【解决方案1】:

我在这个话题中找到了决定:how to handle RxAndroid errors in the main thread;

需要交换“retryWhen”和“observeOn”,因为retryWhen有“延迟功能”,切换到计算线程:)

【讨论】:

    猜你喜欢
    • 2021-10-06
    • 2020-01-13
    • 1970-01-01
    • 1970-01-01
    • 2014-11-11
    • 2014-01-16
    • 2018-01-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多