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

问题描述 投票:0回答:1

我使用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;
    }
}
android mvvm rx-java2 android-livedata
1个回答
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();
}
© www.soinside.com 2019 - 2024. All rights reserved.