如何在基础活动暂停时暂停rxjava Observable.interval

时间:2018-04-10 21:21:10

标签: android mvvm rx-java2 android-livedata

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

1 个答案:

答案 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();
}