繁体   English   中英

RxAndroid,停止计时器/ observable.interval in activity onDestroy()

[英]RxAndroid, Stop timer/observable.interval in activity onDestroy()

我在我的应用程序中使用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'

你可以在这里做的是在CompositeDisposable (RxJava 2)或CompositeSubsciption (RxJava)对象中的Activity中使用所有订阅引用。

将您的订阅添加为:

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

您只需要在onDestroy方法中调用Dispose of Observable

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

 Disposable disposable;

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

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

使用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();
    }

我已经弄明白了,但不知道这是否是正确的方法。 我只使用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();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM