gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 13:04:01 26 4
gpt4 key购买 nike

我正在使用 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com