【问题标题】:RxAndroid, Stop timer/observable.interval in activity onDestroy()RxAndroid,在活动 onDestroy() 中停止计时器/observable.interval
【发布时间】:2018-01-30 07:20:59
【问题描述】:

我在我的应用程序中使用 RxAndroid 来处理计时器任务。用 Observable.interval() 来做。一切正常,但我需要在活动的 onDestroy() 中停止计时器。我真的没有任何想法去做。谁能帮帮我?这是我正在使用的代码:

Observable.interval(0, 10, TimeUnit.SECONDS)
            .flatMap(n -> mObservableNewChat)
            .doOnError(i -> showNoInternetConnection())
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new Observer<NewChatModel>() {
                @Override
                public void onCompleted() {
                    Log.e("ActivityChat: ", "onCompleted");
                }

                @Override
                public void onError(Throwable e) {
                    Log.e("ActivityChat: ", "onError- " + e.getMessage());
                }

                @Override
                public void onNext(NewChatModel model) {
                    Log.e("ActivityChat: ", "onNext");
                    apiCallingNewChat();
                }
            });

我使用的依赖项是:

compile 'io.reactivex:rxjava:1.1.6'
compile 'io.reactivex:rxandroid:1.2.1'
// GSON
compile 'com.google.code.gson:gson:2.4'
// Serializing JSON
compile 'com.squareup.retrofit2:adapter-rxjava:2.0.2'
compile 'com.squareup.retrofit2:converter-gson:2.0.0'

【问题讨论】:

  • 为什么不能直接清除一次性复合材料?

标签: android rx-android


【解决方案1】:

您可以在此处将 Activity 中使用的所有订阅引用保存在 CompositeDisposable (RxJava 2) 或 CompositeSubsciption (RxJava) 对象中。

将您的订阅添加为:

Subscription subscription = Observable.interval(0, 10, TimeUnit.SECONDS)
            .flatMap(n -> mObservableNewChat)
            .doOnError(i -> showNoInternetConnection())
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new Observer<NewChatModel>() {
                @Override
                public void onCompleted() {
                    Log.e("ActivityChat: ", "onCompleted");
                }

                @Override
                public void onError(Throwable e) {
                    Log.e("ActivityChat: ", "onError- " + e.getMessage());
                }

                @Override
                public void onNext(NewChatModel model) {
                    Log.e("ActivityChat: ", "onNext");
                    apiCallingNewChat();
                }
            });

disposables.add(subscription);

您可以在onDestroy 上:

@Override
protected void onDestroy() {
    disposables.dispose();
    super.onDestroy();
}

您可以在您的onCreate 回调中创建您的CompositDisposable

【讨论】:

  • 感谢您的回答。我得到了解决方案,但我不知道我这样做的方式是否正确。我在下面发布我的解决方案。
【解决方案2】:

使用 RxJava2

在你的 gradle 里面放这个库

/*RxJava2 lib*/
    compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
    compile "io.reactivex.rxjava2:rxjava:2.1.8"
    compile 'com.jakewharton.retrofit:retrofit2-rxjava2-adapter:1.0.0'

现在在您的活动/片段中

CompositeDisposable cd;

Observable.interval(0, 10, TimeUnit.SECONDS).subscribe(new Observer<Long>() 
       {

        @Override
        public void onSubscribe(Disposable d) {
           /*add disposable object here*/
            cd.add(d);
        }

        @Override
        public void onNext(Long aLong) {

        //your logic here 
        }

        @Override
        public void onError(Throwable e) {
        }

        @Override
        public void onComplete() {
        }
    });

然后调用复合一次性的dispose()

 @Override
   protected void onDestroy() {
    cd.dispose();
    super.onDestroy();
    }

【讨论】:

  • 感谢您的回答! @Mohd Saquib。但我需要使用 RxJava 来完成,否则我还必须更改许多其他类中的大量代码。无论如何感谢您的回答。
  • @ranasaha 我遇到了你的问题,你使用 rxjava 然后使用 Subscription 对象并将你的 observable 分配给订阅对象并在 onDestroy() 上取消订阅 ....
  • 是的,我想我已经做到了。我已经在上面发布了我的返工。和你建议的一样吗?请看看我的回答。谢谢。 @Mohd Saquib
【解决方案3】:

你只需要在你的 onDestroy 方法中调用你的 Observable 的 Dispose

Ps:最好在 OnStop 方法中调用 dispose

 Disposable disposable;

disposable = Observable.interval(0, 10, TimeUnit.SECONDS)...subscribe(...);

override fun onStop() {
        super.onStop()
        disposable.dispose()
}

【讨论】:

    【解决方案4】:

    我已经想通了,但不知道这是否是正确的方法。 我只使用 RxJava 来做这件事。代码如下:

    private Subscriber<NewChatModel> mIntervalApiCallSubscriber; 
    mIntervalApiCallSubscriber = new Subscriber<NewChatModel>() {
            @Override
            public void onCompleted() {
                Log.e("ActivityChat: ", "onCompleted");
            }
    
            @Override
            public void onError(Throwable e) {
                Log.e("ActivityChat: ", "onError- " + e.getMessage());
            }
    
            @Override
            public void onNext(NewChatModel newChatModel) {
                Log.e("ActivityChat: Interval ", "onNext");
                apiCallingNewChat();
            }
        };
    
        mSubscriptionNewChat = Observable.interval(0, 5, TimeUnit.SECONDS)
                .flatMap(n -> mObservableNewChat)
                .doOnError(i -> showNoInternetConnection())
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(mIntervalApiCallSubscriber);
    

    而在Activity中的onDestroy(),

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (this.mIntervalApiCallSubscriber != null)
            this.mIntervalApiCallSubscriber.unsubscribe();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多