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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在基础活动暂停时暂停rxjava Observable.interval相关的知识,希望对你有一定的参考价值。

我使用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,从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();
}

以上是关于如何在基础活动暂停时暂停rxjava Observable.interval的主要内容,如果未能解决你的问题,请参考以下文章

当我的活动不可见时,如何在 Android WebView 中暂停 Flash 内容?

用户不移动时如何自动暂停 GPS 跟踪器

当活动不在前面时,在Android中暂停CountDownTimer

在 ActivityGroup 中暂停和恢复子活动

如何在android中恢复最近暂停的活动?

浏览器如何暂停/更改JavaScript时选项卡或窗口未激活?