【问题标题】:Clearning CompositeDisposable in MVP在 MVP 中清除 CompositeDisposable
【发布时间】:2020-11-09 04:50:30
【问题描述】:

我正在 MVP 架构中使用 rxjava 实现改造 api 调用并观察数据,问题是我不知道如何使用一次性,因为无法调用 ondestroy() 来清除观察者,各位大侠有什么办法,谢谢

  • 这是我的 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}")
           }
       })
}

【问题讨论】:

    标签: android kotlin mvp


    【解决方案1】:

    虽然我们在 Presenter 中没有像在 ViewModels 中有 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);
    

    我不知道您的片段/演示者的结构如何,但我认为这应该足以让您大致了解。如果您需要更多帮助,请向我发送更多代码,我会尝试根据您的代码进行调整。

    有一篇很好的文章介绍了如何实现这一点,因此请随意查看: https://medium.com/@jospedrocardoso/mvp-an-android-implementation-using-rxjava2-48fb377aa5cd

    【讨论】:

    • 我想我理解你的代码,但是在 onViewAttached () 和 onViewDetached() 里面,我应该清除我的compositeDisposable,我的意思是在那里做什么逻辑谢谢
    • 嘿@takieddine 对不起,我已经编辑了答案,请看看这是否更清楚地说明了如何使用它!
    • 非常感谢您的好回答,如果您不介意,只有一件事,在我的项目中,我使用 viewpager 和一个包含三个片段的活动,在使用参数 T 制作了我的第一个片段之后: IPresenter 现在 viewpager 无法识别片段,这是截图imgur.com/a/x2vvbnb,任何解决方案
    • 好吧,既然你声明了 T 扩展 IPresenter,那么现在在创建片段实例时你应该告诉 T 是什么。如果你使用 Presenter 作为上面的例子,你应该像这样声明你的片段:TotalFragment()。 T extends IPresenter 意味着我们在片段中声明了一个类型 T,它可以是任何实现 IPresenter 接口的类。泛型非常棘手,您需要一些时间才能习惯使用它们。如果对您有帮助,请考虑将答案标记为已接受,一切顺利!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-12
    • 2018-03-21
    • 1970-01-01
    • 2017-02-22
    • 2018-09-11
    • 1970-01-01
    相关资源
    最近更新 更多