如何在底层 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();
}