Android MVP 发布 Presenter 的正确方法

Android MVP Proper Way to Release Presenter

我正在使用 MVP 架构,并且一直在研究如何正确发布演示者。首先,让我告诉你们发生了什么事。

问题

1) 我的演示者发出异步服务器请求。

2) 当我收到服务器响应时,我的视图(片段)已经分离,但我的演示者仍然持有它的实例(这可能导致内存泄漏),我从 View 调用一个方法来设置一些数据我从服务器收到了。

3) 在我的视图中,我使用来自 getActivity() 方法的上下文,在这个阶段将 return .

我是如何解决这个问题的

1) 当我分离片段时,我在演示者上调用 release() 方法。在这个方法中,我考虑过将我的视图实例设置为 null。这会起作用,但是我需要在我的演示者的任何地方添加空检查,检查我的视图是否已经设置为空。似乎不是最好的方法。

2)在我看来(片段),在使用它之前检查getActivity()是否为null。但它并没有解决内存泄漏问题,我需要在我的片段中的任何地方添加这个检查;


你们有其他选择吗?当我的片段以某种方式分离时,这是释放我的演示者的正确方法吗?每当我的演示者在我的视图上调用方法时,我将确保该视图附加到 Activity? EventBus 是一个好的方法吗?

非常感谢!

presenter 层的主要目标之一是 Android 框架独立,这意味着您不需要从 Android 框架导入任何包,使其成为纯粹 Java class。您应该让 ActivityFragment 实现 ActivityView 接口或 FragmentView 接口,并让具体的 ActivityFragment 实现该接口。现在,在 onCreate() 中,您创建了一个演示者实例并将视图(Activtity 或 Fragment)作为参数传递,而在 Presenter class 中,您将拥有 ActivityViewFragmentView 引用,通过构造函数初始化它,像这样:

Activity.java

public class Activity implements ActivityView {
    ...
    private Presenter mPresenter;

    public void onCreate() {
         // some other code

         mPresenter = new Presenter(this);

         // some other code
    }

Presenter.java

    public class Presenter {
         private ActivityView mActivityView;


         public Presenter(ActivityView activityView) {
           this.mActivityView = activityView;
         }
}

现在您可以调用ActivityFragments中的方法,但这些方法必须在接口中列出。如果你是你的 RxJava2,你可以在 Presenter 中有 CompositeDisposable 对象,将你的网络调用添加到一次性的,并在适当的生命周期方法中从 ActivityFragment,当然可以通过 PresentercompositeDisposable 上调用 dispose() 方法。通过这种方式,您将清除任何正在进行的网络操作,如果 UI 不存在,则不会更新 UI。希望这个答案对你有帮助:)