如何使用RxJava避免回调地狱

3
subscriptionSet = provider.removeGeofences(mGeofencePendingIntent).observeOn(AndroidSchedulers.mainThread()).subscribe(new Subscriber<Status>() {
            @Override
            public void onCompleted() {

            }

            @Override
            public void onError(Throwable e) {
                Log.d(TAG, "onError() called with: " + "e = [" + e + "]");
            }

            @Override
            public void onNext(Status status) {
                Prefs.geofence.clear();
                subscriptionAdd = statusObservable.observeOn(AndroidSchedulers.mainThread()).subscribe(new Subscriber<Status>() {
                    @Override
                    public void onCompleted() {

                    }

                    @Override
                    public void onError(Throwable e) {
                        Log.d(TAG, "onError() called with: " + "e = [" + e + "]");
                    }

                    @Override
                    public void onNext(Status status) {
                        Prefs.geofence.set(...);
                    }
                });
            }
        });

我正在尝试使用优秀的Android-ReactiveLocation库来实现类似于集合操作的地理围栏 - 如果已存在,则清除它并将其设置为所需位置,以便始终只有一个地理围栏。

同时,我也在学习RxJava,听说它可以解决回调地狱问题,那么在我的情况下它如何解决呢?

谢谢!

1个回答

3
当您想要使用连续的订阅时,应使用flatMap操作符。这样,您的问题可以简化为:
subscription = provider.removeGeofences(mGeofencePendingIntent)
            .flatMap(new Func1<Status, Observable<Status>>() {
                @Override
                public Observable<Status> call(Status status) {
                    //after the first subscription
                    Prefs.geofence.clear();
                    return statusObservable;
                }
            })
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new Action1<Status>() {
                @Override
                public void call(Status status) {
                    //after the second subscription
                    Prefs.geofence.set(...);
                }
            }, new Action1<Throwable>() {
                @Override
                public void call(Throwable throwable) {
                    Log.d(TAG, "onError() called with: " + "e = [" + e + "]");
                }
            });

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接