使用CompositeDisposables的最佳做法是什么?

时间:2018-06-12 18:55:45

标签: android retrofit rx-java retrofit2 rx-java2

我尝试在onComplete()块上调用它,但带有改进网络调用的compositeDisposables.clear()会导致调用在中途被取消。

                               observable.......
                               .subscribe(
                                {
                                    utilModule.logI("net repo response")
                                    //cleanDisposables()//this causes HttpOk cancelled error
                                },
                                {
                                    utilModule.logI("no repo response" + it.message)
                                    //cleanDisposables()
                                }
                        ))
    }

    private fun cleanDisposables() {
        //clean old network observables, dispose will prevent further observing
        utilModule.logI("disposing observables")
        if (!compositeDisposables.isDisposed) {
            compositeDisposables.clear()
        }
    }

2 个答案:

答案 0 :(得分:3)

通常,您的一次性用品将与您的活动或片段生命周期相关联,并在onDestroy中清除。

这可能是使用MVP设计模式的一个例子......

presenter.kt
fun dispose() {
    compositeDisposable.clear()
}


activity.kt
override fun onDestroy() {
    super.onDestroy()
    presenter.dispose()
}

答案 1 :(得分:1)

以下是我在MVVM中的操作方法。我有LifeCycle-ed Activity,它包含在我的ViewModel中。然后在ViewModel类中我有CompositeDisposable的实例。我在ViewModel clear方法中onCleared。{/ p>

这是一个存根

public class MyViewModel extends AndroidViewModel {
    private MyRepo mRepo;
    private CompositeDisposable mDisposables = new CompositeDisposable();


    public MyViewModel(@NonNull Application application) {
        super(application);

        mRepo = MysRepo.getInstance(...);
    }

    public void loadData()
    {
        Disposable d = mRepo.getMyPeculiarData()
                ...
                .subscribe(...);

        mDisposables.add(d);
    }


    @Override
    protected void onCleared() {
        super.onCleared();
        mDisposables.clear();
    }

}