[英]Android MVP Proper Way to Release Presenter
我正在使用MVP架构,我一直坚持如何正确释放演示者。 首先,让我告诉你们发生了什么。
问题
1)我的演示者发出异步服务器请求。
2)当我收到服务器响应时,我的视图(片段)已经分离,但我仍然在我的演示者上保持其实例(这可能导致内存泄漏),我从View调用一个方法来设置从服务器收到的一些数据。
3)在我的视图中,我使用getActivity()方法的上下文,在此阶段将返回null 。
我如何试图解决这个问题
1)当我分离片段时,我在演示者上调用了release()方法。 在这个方法中,我考虑将视图的实例设置为null。 这可行,但后来我需要在演示者的每个地方添加空检查,检查我的视图是否已设置为null。 似乎不是最好的方法。
2)在我的视图(片段)中,在使用之前检查getActivity()是否为null。 但它并没有解决内存泄漏问题,我需要在我的片段中随处添加这个检查;
你们有替代品吗? 当我的片段被分离时,这是一种释放我的演示者的正确方法,每当我的演示者在我的视图上调用一个方法时,我将确保该视图附加到一个Activity? EventBus是一个很好的方法吗?
非常感谢!
presenter层的主要目标之一是独立于Android Framework,这意味着您没有从Android Framework导入任何包,使其成为纯Java类。 你应该让你的Activity
或Fragment
实现ActivityView
接口或FragmentView
接口,让具体的Activity
或Fragment
实现那个接口。 现在,在onCreate()
创建一个presenter实例并将View(Activtity或Fragment)作为参数传递,在Presenter类中,您将拥有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,你可以在Presenter
拥有CompositeDisposable
对象,将你的网络调用添加到那个一次性,并且在Activity
或Fragment
适当生命周期方法中,你可以通过Presenter
调用compositeDisposable
上的dispose()
方法。 这样,您将清除任何正在进行的网络操作,如果UI不存在,则不会更新UI。 希望这个答案可以帮助你:)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.