【问题标题】:Rxjava2/RxAndroid2, dispose (looking for an equivalent for rx1 unsubsribe)Rxjava2/RxAndroid 2,处置(寻找 rx1 取消订阅的等价物)
【发布时间】:2017-08-15 18:26:48
【问题描述】:

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

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

前rxjava/rxandroid库的方法

我的目标很简单

  • 执行 API 调用(网络操作)
  • 聆听 observable 发出的内容并做出反应(快乐路径)
  • 当应用进入 PAUSE 状态时,不要监听或做出反应
  • 或者,只要 android 进入暂停生命周期,就取消订阅 observable

,根据周围的资源有

 dispose()

rx2 的方法,我对此的理解是它会处理任何当前资源(在我的情况下,根据我的理解,调用它会使 observable 将自身分离到任何观察者)。

但这似乎不是我所期望的,请查看 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)执行某些操作并且应用程序进入 pause 状态怎么办?”,我不希望 UI(Observer)对此做出反应不再是特定的 UI。

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

任何帮助将不胜感激。

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

    • “你应该做的,只是在你的观察者上使用 onSubscribe(Disposable d) 方法”,感谢这一点,我从 onSubscribe 实现中获取了一次性参数并将其引用到一次性变量,它起作用了!但是,只是为了添加一些关于此的问题,这与 rx1 的 Subscription.unsubscribe 相同吗? ,在 rx2 中我找不到类似的 .subscribe (即订阅回 observable),所以我唯一能做的就是重新创建/重新执行所有步骤/代码?
    • 我不太清楚你是什么意思,但是 Disposable.dispose 就像 RxJava1 的 Subscription.unsubscribe
    • 对不起,我想我回答的时间很长。我的意思是,重新订阅的唯一方法是再次重新订阅?比如,现有的Observable.subscribe() ?或者只是创建另一个 observable 并订阅一个新的?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多