在RxJava中处理可观察对象并中断它们的正确方法

时间:2018-06-21 10:03:19

标签: java android rx-java rx-android

我有这样的代码:

流程X:

   getLocationObservable() // ---> async operation the fetches the location. 
    //  Once location is found(or failed to find) it sends it to this filter :
            .filter(location -> {
                --- Operation A ---
                after finishing the operation A, I either return 'true' and continue 
                 to the next observable which is a Retrofit server call, or simply 
                  return 'false' and quit.
            })
            .flatMap(location -> getRetrofitServerCallObservable( location )
                    .subscribeOn(Schedulers.io())
                    .observeOn(AndroidSchedulers.mainThread()))
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(
                    new Observer<MyCustomResponse>() {
                        @Override
                        public void onSubscribe(Disposable d) {
                            _disposable = d;
                        }
                        @Override
                        public void onNext(MyCustomResponse response) {

                        }
                        @Override
                        public void onError(Throwable e) {

                        }
                        @Override
                        public void onComplete() {

                        }
                    });

在Location类中是这样的:

 private PublishSubject<Location> locationPublishSubject = PublishSubject.create();

    public Observable<Location> getLocationObservable() {
        return locationPublishSubject;
    }

    and then...
    locationPublishSubject.onNext( foundLocation );

getLocationObservable基于PublishSubject,它通过onNext返回位置。

我的目标是完全控制整个ProcessX。这意味着:无论当前是否正在获取getLocationObservable中的位置,还是正在过滤器中执行操作A,还是正在执行RetrofitCall observable-用户点击某件事,无论我在做什么,我都想停止/取消/中断。因为否则将导致无法预测的行为,并最终导致致命事故。

如何做到这一点,同时确保我没有问题(例如内存泄漏问题等)?

是否会在名为“ _disposable”(如上面的代码中所述)的引用上调用“ dispose()”?

1 个答案:

答案 0 :(得分:0)

您应该考虑创建CompositeDisposable()并在onSubscribed()调用中将可观察到的添加到其中。然后,如果用户单击屏幕上的任意位置,则可以致电compositeDisposable.clear() 中断在该可观察状态下正在进行的任何操作。

此外,由于您已经将io()和mainThread()分配给基本可观察对象,因此您无需在flatMap中分配相同的对象。新的可观察对象将跟随父可观察对象的对象。