我在我的应用程序中使用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'
答案 0 :(得分:4)
您可以在此处执行的操作是在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();
}
您可以在CompositDisposable
回调中创建onCreate
。
答案 1 :(得分:2)
您只需要在onDestroy方法中调用Observable Observable
Ps:最好在OnStop方法中调用dispose
Disposable disposable;
disposable = Observable.interval(0, 10, TimeUnit.SECONDS)...subscribe(...);
override fun onStop() {
super.onStop()
disposable.dispose()
}
答案 2 :(得分: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();
}
答案 3 :(得分:1)
我已经弄明白了,但不知道这是否是正确的方法。 我只使用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();
}