清除 MVP 中的 CompositeDisposable

Clearning CompositeDisposable in MVP

我正在 MVP 架构中使用 rxjava 实施改造 api 调用和观察数据,问题是我不知道如何使用 disposable ,因为不可能调用 ondestroy() where我们可以清除我们的观察者,任何关于如何做到这一点的想法,谢谢

class Presenter(var iView: IView,var context: Context) : IPresenter {
 override fun getGlobalData() {

       RetrofitSingleton().getGlobalStats()
           ?.subscribe(object : Observer<GlobalModel>{
           override fun onComplete() {

           }
           override fun onSubscribe(d: Disposable) {
             //here i add disposable but how to clear it 

           }
           override fun onNext(t: GlobalModel) {
               val cases = t.cases
               val death = t.deaths
               val recovered = t.recovered
               iView.getGlobalList(cases!!, death!!, recovered!!)
           }

           override fun onError(e: Throwable) {
               Log.d("TAG","Exception ${e.message}")
           }
       })
}

虽然我们在 Presenter 中没有方法,但我们在 ViewModel 中有 onCleared(),但强烈建议让我们的 Presenter 了解生命周期。我们应该有像 onViewAttached/onViewDetached 这样的方法,我们将从片段对应的方法中调用这些方法。

示例:

public abstract class IPresenter {
    public void onViewAttached();
    public void onViewDetached();
    // Other IPresenter methods
}

在我们的基础片段中:

public class BaseFragment<T extends IPresenter> extends Fragment {
    protected T mPresenter;
    
    @Override
    public void onViewCreated(final View view, @Nullable final Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        if (mPresenter != null) {
            mPresenter.onViewAttached();
        }
    }

    @Override
    public void onDestroyView() {
        super.onDestroyView();
            if (mPresenter != null) {
                mPresenter.onViewDetached();
            }
    }
}

在您的演示者中:

public void onViewAttached() {
    mCompositeDisposable = new CompositeDisposable();
}

public void onViewDetached() {
    if (mCompositeDisposable != null) {
        mCompositeDisposable.clear();
    }
}

每当您使用 RX 时,您都应该在 mCompositeDisposable 中添加每个一次性用品,例如:

mCompositeDisposable.add(disposable);

我不知道您的 fragments/presenters 是如何构建的,但我认为这应该足以让您了解总体思路。如果您需要更多帮助,请给我发送更多代码,我会尝试根据您的代码进行调整。

有一篇关于如何实现此目标的好文章,请随时查看: https://medium.com/@jospedrocardoso/mvp-an-android-implementation-using-rxjava2-48fb377aa5cd