我正在使用 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 类。你应该让你的Activity
或 Fragment
实现 ActivityView
接口(interface)或 FragmentView
界面, Ant 让混凝土Activity
或 Fragment
实现该接口(interface)。现在,在 onCreate()
您创建演示者的实例并将 View (Activtity 或 fragment )作为参数传递,并且在演示者类中您将拥有 ActivityView
或 FragmentView
引用,通过构造函数初始化它,像这样:
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
中的对象,将您的网络调用添加到一次性的,并在适当的生命周期方法中来自 Activity
或 Fragment
,您可以调用dispose()
compositeDisposable
上的方法, 通过 Presenter
当然。通过这种方式,您将清除任何正在进行的网络操作,使其在 UI 不存在时不更新 UI。希望这个答案对你有帮助:)
关于java - Android MVP 发布 Presenter 的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50983845/