java - Android MVP 发布 Presenter 的正确方法

标签 java android memory-leaks architecture mvp

我正在使用 MVP 架构,我一直在研究如何正确释放演示者。首先,让我告诉大家发生了什么事。

问题

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

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

3) 在我的 View 中,我使用了 getActivity() 方法的上下文,该方法在这个阶段将返回 null

我是如何解决这个问题的

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

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


你们有替代方案吗?当我的 fragment 以某种方式分离时,这是释放我的演示者的正确方法吗?每当我的演示者在我的 View 上调用方法时,我将确保该 View 附加到 Activity ? EventBus 是一个好的方法吗?

非常感谢!

最佳答案

presenter 层的主要目标之一是独立于 Android Framework,这意味着您无需从 Android Framework 导入任何包,使其成为纯 Java 类。你应该让你的ActivityFragment实现 ActivityView接口(interface)或 FragmentView界面, Ant 让混凝土ActivityFragment实现该接口(interface)。现在,在 onCreate()您创建演示者的实例并将 View (Activtity 或 fragment )作为参数传递,并且在演示者类中您将拥有 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;
         }
}

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

关于java - Android MVP 发布 Presenter 的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50983845/

相关文章:

java - 多次使用class.forname会导致内存泄漏吗? (在tomcat内部运行)

tomcat - 负载测试期间内存不断上升

java - Heroku 上的 Play Framework [2.1.1-java] 部署错误

java - 访问现有属性返回 null

java - 如何最好地使用 Java 验证客户端与 elasticsearch 的连接?

android - 如何将位图发送到 WhatsApp 应用程序

node.js - 如何使用 zlib 改进 Node.js 中内存泄漏的代码?

Java 8 将 Map<Integer, List<String>> 转换为 Map<String, List<Integer>>

android - 480x800 和 800x480 一样吗?

android - GPS定位一次