【问题标题】:RXJava how to make an observable continue onErrorRXJava如何使可观察的继续onError
【发布时间】:2016-05-22 19:57:40
【问题描述】:

考虑以下示例:

    WidgetObservable.text(searchView).debounce(250, TimeUnit.MILLISECONDS).flatMap(new Func1<OnTextChangeEvent, Observable<List<String>>>() {

        @Override
        public Observable<List<String>> call(OnTextChangeEvent onTextChangeEvent) {
            String s = onTextChangeEvent.text().toString();
            return provider.getGeocodeObservable(s, 5).flatMap(new Func1<List<Address>, Observable<String>>() {
                @Override
                public Observable<String> call(List<Address> addresses) {
                    return Observable.from(addresses).map(new Func1<Address, String>() {
                        @Override
                        public String call(Address address) {
                            String addresss = address.getAddressLine(0); // If any additional address line present than only, check with max available address lines by getMaxAddressLineIndex()
                            String city = address.getLocality();
                            //String state = address.getAdminArea();
                            String country = address.getCountryName();
                            return String.format("%s, %s, %s", addresss, city, country);
                        }
                    });
                }
            }).collect(new Func0<List<String>>() {
                @Override
                public List<String> call() {
                    return new ArrayList<String>();
                }
            }, new Action2<List<String>, String>() {
                @Override
                public void call(List<String> strings, String s) {
                    strings.add(s);
                }
            }).subscribeOn(Schedulers.io());
        }
    }).observeOn(AndroidSchedulers.mainThread()).subscribe(new Subscriber<List<String>>() {
        @Override
        public void onCompleted() {

        }

        @Override
        public void onError(Throwable e) {
            Log.e("MapsActivity", "What?", e);
        }

        @Override
        public void onNext(List<String> strings) {
            Log.d("MapsActivity", "works " + strings);
            adapter.clear();
            adapter.addAll(strings);
            adapter.notifyDataSetChanged();
            searchView.showDropDown();
        }
    });

在这里,我观察了自动完成视图上的文本更改,并使用Android-ReactiveLocation 对其进行操作以获取相关的地址建议。它工作得很好,直到 geocode observable 发生错误,导致 onError 在最终订阅者上被调用。自从发生此错误后,WidgetObservable 将不再发出事件。

如何解决它,以便 onError 不会导致 Observable 停止发出文本更改事件,从而使整个流程继续发生?

顺便说一句,我是响应式编程和 RXJava 的新手,所以任何对我的代码的改进建议都会受到欢迎:)

【问题讨论】:

    标签: android rx-java reactive-programming observable android-reactivelocation


    【解决方案1】:

    您可以在地理编码 observable 上尝试 OnErrorReturn 运算符,即

    provider.getGeocodeObservable(s, 5)
            .onErrorReturn(new Func1<Throwable, List<String>>() {
                    @Override
                    public String call(Throwable throwable) {
                        return  Arrays.asList(new String[]{});
                    }
                })
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多