【问题标题】:How to pause rxjava Observable.interval when underlying activity pauses底层活动暂停时如何暂停 rxjava Observable.interval
【发布时间】:2018-09-20 15:04:41
【问题描述】:

我使用 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】:

    您可以从您的控制器调用 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()
    }
    

    来自您的控制器(如果是活动或片段)

    @Override
    public void onResume(){
        super.onResume();
        viewModel.resumePooling();
    }
    
    @Override
    public void onPause(){
        super.onPause();
        viewModel.stopPooling();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-27
      • 1970-01-01
      • 2023-04-04
      • 2016-11-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多