Rxjava2 / RxAndroid2,dispose(寻找rx1 unsubsribe的等价物)

时间:2017-03-23 09:29:40

标签: android dispose rx-android rx-java2 unsubscribe

这是我第一次在反应范式世界中开发,我开始使用rxjava2 / rxandroid2,基于我观看过的视频和我读过的文章,似乎从2开始就更好了1许多变化使图书馆大规模地不同,但现在我在寻找像

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

以前的rxjava / rxandroid库的方法

我的目标很简单

  • 执行API调用(网络操作)
  • 倾听并反应观察者会发出什么(快乐的道路)
  • 当应用程序进入PAUSE状态时不要听或做出反应
  • 或者,一旦android进入暂停生命周期,就取消订阅observable

,基于周围的资源

 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,但这似乎不起作用,我在这里错过了什么?或者我完全不理解的东西,我对我的代码的思考是,

“如果onNext正在对窗口小部件(UI)执行某些操作(Observer)并且应用程序继续暂停状态?”,我不希望该UI(Observer)对该特定UI做出反应了。

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

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:6)

您正在错误地处理ObserverDisposableDisposable对象应由Observable发送给您,您不能自己创建它,并且调用明确地Observer.onSubscribe()使用它,因为它没有连接到Observable并且不会终止它。 (您还可以注意到Observer.onSubscribe被调用了两次,一个被Observable调用,一个被你调用了

您应该做什么,只需使用onSubscribe(Disposable d)上的Observer方法保存DisposableObservable会自动调用Disposable并将您发送给我正确的Disposable对象,您可以使用它成功终止网络操作。

另一种选择是,不要使用subscribe(Observer o)方法,而是将onNext / onError / onCompleted作为参数的其他重载,并返回{{ 1}}对象,您可以使用它来处理(取消订阅),以终止网络呼叫。