Android MVP发布演示者的正确方法

时间:2018-06-22 08:31:55

标签: java android memory-leaks architecture mvp

我正在使用MVP架构,但我坚持如何正确发布演示者。首先,让我告诉大家发生了什么事。

问题

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

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

3)在我的视图内,我使用 getActivity()方法中的上下文,该方法在此阶段将返回 null

我如何尝试解决此问题

1)当我分离片段时,我在演示者上调用 release()方法。在此方法内部,我考虑过将视图实例设置为null。这将起作用,但是随后我需要在演示者的所有位置添加字面量检查,以检查我的视图是否已设置为空。似乎不是最好的方法。

2)在我的观点(片段)中,在使用 getActivity()之前,请先检查其是否为null。但这并不能解决内存泄漏问题,因此我需要在我的Fragment(s)中的每一个地方逐字添加此检查;


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

非常感谢!

1 个答案:

答案 0 :(得分:2)

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