android – RxJava的.debounce()干扰了我的Observable的线程和错误处理

我想在我的 Android应用程序中进行标准搜索,我在其中键入EditText,等待用户完成输入,然后使用Retrofit启动网络请求:
// make observable out of EditText
Observable<OnTextChangeEvent> textObs = Widgetobservable.text(searchText);

mSearchResultSubscription =
    textObs

        // wait until user has not typed for 350 milliseconds
        .debounce(350,TimeUnit.MILLISECONDS)

        // get the string the user typed
        .map(OnTextChangeEvent::text)
        .map(CharSequence::toString)

        // start a new observable (from Retrofit)
        .flatMap(
            q ->
                // try network call and return my data
                MyRetrofitAPI.getService().search(q)

                    // if this fails,just return empty observable
                    .onErrorResumeNext(error -> {
                        Log.e("Error from retrofit: " + error.getLocalizedMessage());
                        return Observable.empty();
                    })

        )

        // if all is well,show the contents on the screen somehow
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(a -> {
                mAdapter.setItems(a);
            },error -> {
                Log.e("Also error in outer observable: " + error.getLocalizedMessage());
            }
        );

现在,我有一个测试服务器,它接受改进调用并返回一个列表.当我输入’crash’时,服务器执行一些无效的代码错误,返回http状态代码500,以及一些错误html.因此,改装调用失败了.

我认为外部的Observable链不应该受此影响.请参阅我之前的问题:In RxJava,how to retry/resume on error,instead of completing the observable

但是,外部Observable也有错误,导致链终止.错误是:
当前线程必须有一个弯针!

奇怪.现在我尝试没有.debounce()并且同样的事情发生,服务器有一个内部错误,但外部Observable没有错误.

那么.debounce()它对导致这种行为的线程有什么影响呢?我该如何解决它?

解决方法

添加pturner’s answer,可以将调度程序作为传递

.debounce(400,TimeUnit.MILLISECONDS,AndroidSchedulers.mainThread())

这将导致观察者在Android的主线程(UI线程)上工作,并将阻止Observer抛出错误.

相关文章

Android性能优化——之控件的优化 前面讲了图像的优化,接下...
前言 上一篇已经讲了如何实现textView中粗字体效果,里面主要...
最近项目重构,涉及到了数据库和文件下载,发现GreenDao这个...
WebView加载页面的两种方式 一、加载网络页面 加载网络页面,...
给APP全局设置字体主要分为两个方面来介绍 一、给原生界面设...
前言 最近UI大牛出了一版新的效果图,按照IOS的效果做的,页...