gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:51:45 25 4
gpt4 key购买 nike

我想在我的 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 也会出错,导致链终止。错误是:当前线程必须有looper!

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

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

最佳答案

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

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

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

关于android - RxJava 的 .debounce() 干扰了我的 Observable 的线程和错误处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31434157/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com