无法在未调用的线程上敬酒,RxJava2

时间:2018-10-12 02:30:16

标签: java android android-toast

我有此代码:

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()的线程上进行烘烤”。

吐司必须在主线程调用,谢谢。

1 个答案:

答案 0 :(得分:1)

我在以下主题中找到了决定:how to handle RxAndroid errors in the main thread;

需要交换“ retryWhen”和“ observeOn”,因为retryWhen具有“ delay function”,因此切换到计算线程:)