【问题标题】:RxJava's .debounce() interfering with my Observable's threads and error handlingRxJava 的 .debounce() 干扰了我的 Observable 的线程和错误处理
【发布时间】:2015-10-04 17:10:09
【问题描述】:

我想在我的 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());
            }
        );

现在,我有一个测试服务器,它接受改造调用并返回一个列表。当我输入“崩溃”时,服务器会执行一些无效代码和错误,返回 http 状态代码 500 和一些错误 html。所以,改造调用失败了。

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

但是,外部 Observable 也会出错,导致链终止。错误是: The current thread must have a looper!

奇怪。现在我尝试不使用 .debounce() 并发生同样的事情,服务器有一个内部错误,但外部 Observable 确实 not 错误。

那么.debounce() 对导致这种行为的线程做了什么?我该如何解决?

【问题讨论】:

    标签: android multithreading retrofit rx-java rx-android


    【解决方案1】:

    添加到pturner's answer,Scheduler可以传递为

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

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

    【讨论】:

      【解决方案2】:

      似乎问题可能在于去抖动创建一个新线程以执行代码,来自docs

      此变体默认在计算调度程序上运行,但您可以选择传入您选择的调度程序作为第三个参数。

      您可能需要传入一个带有后台 Looper 的 Android 调度程序,这可以解决错误(理论上,很遗憾,如果没有服务器,您现在无法运行您的东西)。

      【讨论】:

      • 我想我尝试了所有变体.. 不幸的是,没有成功。我想我可能会问 RxJava/RxAndroid 问题跟踪器
      • @xorgate 你有任何回应吗?我有同样的问题。最好的问候
      • @cesarferreira 实际上我没有问。但是我确实删除了 .debounce() 但我对此不太满意......
      • 我也这样做了...但是让搜索发生在每个键入的笔划上...
      猜你喜欢
      • 2021-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多