我想在我的
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抛出错误.
原文地址:https://www.jb51.cc/android/309753.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。