【问题标题】:Android MVP Proper Way to Release PresenterAndroid MVP 发布 Presenter 的正确方法
【发布时间】:2018-12-01 16:33:37
【问题描述】:

我正在使用 MVP 架构,但我一直在思考如何正确释放演示者。首先,让我告诉你们发生了什么。

问题

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

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

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

我是如何解决这个问题的

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

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


你们有替代方案吗?当我的片段被分离时,这是一种释放我的演示者的正确方法,每当我的演示者在我的视图上调用一个方法时,我都会确保该视图附加到一个活动? EventBus 是一个很好的方法吗?

非常感谢!

【问题讨论】:

    标签: java android memory-leaks architecture mvp


    【解决方案1】:

    presenter 层的主要目标之一是独立于 Android 框架,这意味着您无需从 Android 框架导入任何包,使其成为纯 Java 类。你应该让你的ActivityFragment 实现ActivityView 接口或FragmentView 接口,让具体的ActivityFragment 实现该接口。现在,在onCreate() 中,您创建了一个演示者实例,并将视图(活动或片段)作为参数传递,在演示者类中,您将拥有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 的适当生命周期方法中,您可以调用 dispose() 方法compositeDisposable,当然是Presenter。这样,您将清除任何正在进行的网络操作,如果 UI 不存在,则不会更新 UI。希望这个答案对你有帮助:)

    【讨论】:

    • 嗨@RadoVidjen,感谢您的回复!是的,我正在按照你说的做。我让演示者完全独立于 Android 组件,并且演示者和视图之间的所有通信都是通过使用接口完成的。当我说我从 Presenter 调用视图方法时,我的意思是我的 Presenter 调用了我的视图界面上列出的方法。我正在考虑避免使用 RxJava,因为我想在稍后阶段实现 LiveData,这样会使 RxJava 有点无用(根据我的理解,这是有限的,因为我还没有大量搜索 RxJava)。我对么?你有其他不使用 RxJava 的建议吗?
    • 您确定内存泄漏了吗?因为如果您使用该接口进行通信,我认为这是松散耦合的,这意味着如果 View 消失了,presenter 也将变为 null .. 也许我错了,但您可以使用 LeakCanary 进行测试。对于 RxJava,我认为你可以将它与 LiveData 结合起来,你只需要做一些研究,看看这两者是如何一起工作的。在任何情况下,如果您使用 Retrofit 进行网络连接,您应该添加 RxJava2 适配器,因为它可以更轻松地执行异步任务,并将响应传递给主线程。
    • 是的,我确定它会被泄露,因为我已经在使用 LeakCanary:/
    • 是的,我想我得看看 RxJava。非常感谢。
    • 肯定会有泄漏,因为你持有的 ActivityView 实际上是一个 Activity 对象(因为你的 Activity 已经实现了接口),最好的方法是在调用视图方法和我想这很标准。
    猜你喜欢
    • 1970-01-01
    • 2014-07-15
    • 2018-09-18
    • 2017-05-26
    • 2010-12-10
    • 2018-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多