Rxjava2/RxAndroid2,处置(寻找 rx1 退订的等价物)

Rxjava2/RxAndroid2, dispose (looking for an equivalent for rx1 unsubsribe)

这是我第一次在响应式范式世界中开发,我开始使用 rxjava2/rxandroid2,根据我看过的视频和我读过的文章,似乎从 2 开始更好因为 1 有很多变化,在很大程度上与图书馆不同,但现在我在寻找像

这样的东西时遇到了一些麻烦
 unsubscribe()

前rxjava/rxandroid库的方法

我的目标很简单

,根据身边的资源有

 dispose()

rx2 的方法,我的理解是它处理任何当前资源(在我的例子中,根据我的理解,调用它将使可观察者脱离任何观察者)。

但这似乎不是我所期待的,请看一下 ff 代码:

public class MainActivity extends AppCompatActivity {

    final Disposable disposable = new Disposable() {

        @Override
        public void dispose() {
            Log.e("Disposed", "_ dispose called.");
        }

        @Override
        public boolean isDisposed() {
            return true;
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Observer<Object> observer = new Observer<Object>() {

            @Override
            public void onSubscribe(Disposable d) {
                Log.e("OnSubscribe", "On Subscribed Called");
            }

            @Override
            public void onNext(Object value) {
                Log.e("onNext", "Actual Value (On Next Called).");
            }

            @Override
            public void onError(Throwable e) {
                e.printStackTrace();
            }

            @Override
            public void onComplete() {
                Log.e("OnComplete", "On Complete Called.");
            }
        };

        EventsApiService.getInstance().testApi().testCall()
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .doOnDispose(new Action() {
                    @Override
                    public void run() throws Exception {
                        Log.e("Disposed?", "__ Dispose");
                    }
                })
                .subscribe(observer);

        observer.onSubscribe(disposable);
    }

    @Override
    public void onPause() {

        super.onPause();
        disposable.dispose();
    }
}

我有这个输出:

03-23 09:08:05.979 3938-3938/edu.rx.study E/Disposed: _ dispose called.
03-23 09:08:13.544 3938-3938/edu.rx.study E/onNext: Actual Value (On Next Called).
03-23 09:08:13.544 3938-3938/edu.rx.study E/OnComplete: On Complete Called.

我原以为 onNext 不会再被调用,或者 onNext 和 onComplete 都不会被调用,但这似乎不起作用,我在这里遗漏了什么吗?或者有一些我完全不明白的东西,我对我的代码的想法是,

"what if onNext is performing something towards a widget(UI)(Observer) and the app goes on pause state?",我不希望那个 UI(观察者)再对那个特定的 UI 做出反应。

很多人是对的,我承认,转向响应式编程非常困难,尤其是 rxjava2/rxandroid2 的学习曲线非常陡峭。

任何帮助将不胜感激。

你对 ObserverDisposable 的处理不正确,Disposable 对象应该由 Observable 交给你,你不能自己创建它,并用它显式调用 Observer.onSubscribe(),因为它没有连接到 Observable 并且不会终止它。 (您还可以注意到 Observer.onSubscribe 被调用了两次,一次被 Observable 调用,一次被您调用)

你应该做的,只是在你的 Observer 中使用 onSubscribe(Disposable d) 方法来保存 Disposable,它会被 Observable 自动调用并将给你正确的 Disposable 对象,你可以用它成功地终止网络操作。

另一种选择是,根本不使用 subscribe(Observer o) method, but other overloads that takes your onNext/onError/onCompleted 作为参数,以及 returns Disposable 对象,你可以用它来处理(unsusbcribe),以终止网络称呼。