如何在基础活动暂停时暂停rxjava Observable.interval
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在基础活动暂停时暂停rxjava Observable.interval相关的知识,希望对你有一定的参考价值。
我使用MVVM架构,我的数据层/存储库使用RxJava但查看模型以查看图层正在使用LiveData。
在我的视图模型中,我使用rxjava Observable.interval
轮询服务器。
目前我的问题是如何在底层视图(片段)进入暂停状态时暂停轮询?
如果我将rxjava移除到liveData转换并直接在视图上观察rxjava会不会更容易?
public class MyViewModel extends ViewModel {
private final CompositeDisposable disposables = new CompositeDisposable();
private final MediatorLiveData<Resource<DataItem>> dataItems = new MediatorLiveData<>();
MyViewModel(...) {
disposables.add(Observable.interval(0, 10, TimeUnit.SECONDS) // How to pause this?
.observeOn(androidSchedulers.mainThread())
.doOnNext(n -> loadData())
.subscribe());
}
void loadData() {
disposables.add(dataRepository.getData()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.doOnSubscribe(__ -> dataItems.setValue(Resource.loading()))
.subscribe(dataResp -> dataItems.setValue(Resource.success(dataResp)),
throwable -> dataItems.setValue(Resource.error(throwable))));
}
// This is observed by view
LiveData<Resource<DataItem>> getDataItems() {
return dataItems;
}
}
答案
您可以从控制器中调用resume / stop,从viewmodel更改为:
...
private final Disposable poolingDisposable;
...
MyViewModel(...) {
resumePooling()
}
public void resumePooling(){
if(poolingDisposable == null){
poolingDisposable = Observable.interval(0, 10, TimeUnit.SECONDS)
.observeOn(AndroidSchedulers.mainThread())
.doOnNext(n -> loadData())
.subscribe();
disposables.add(poolingDisposable)
}
}
public void stopPooling(){
if(poolingDisposable != null){
poolingDisposable.dispose();
poolingDisposable = null
}
}
@Override
protected void onCleared(){
disposables.dispose()
}
从你的控制器(如果一个活动或片段)
@Override
public void onResume(){
super.onResume();
viewModel.resumePooling();
}
@Override
public void onPause(){
super.onPause();
viewModel.stopPooling();
}
以上是关于如何在基础活动暂停时暂停rxjava Observable.interval的主要内容,如果未能解决你的问题,请参考以下文章
当我的活动不可见时,如何在 Android WebView 中暂停 Flash 内容?