我使用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;
}
}
答案 0 :(得分:1)
您可以从控制器中调用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();
}