如何在底层 activity 暂停时暂停 rxjava Observable.interval
How to pause rxjava Observable.interval when underlying activity pauses
我使用 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,将您的视图模型更改为:
...
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()
}
来自您的控制器(如果是 activity 或片段)
@Override
public void onResume(){
super.onResume();
viewModel.resumePooling();
}
@Override
public void onPause(){
super.onPause();
viewModel.stopPooling();
}
我使用 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,将您的视图模型更改为:
...
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()
}
来自您的控制器(如果是 activity 或片段)
@Override
public void onResume(){
super.onResume();
viewModel.resumePooling();
}
@Override
public void onPause(){
super.onPause();
viewModel.stopPooling();
}