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