我正在使用MVP架构,但我坚持如何正确发布演示者。首先,让我告诉大家发生了什么事。
问题
1)我的演示者提出了一个异步服务器请求。
2)当我收到服务器响应时,我的视图(片段)已经被分离,但是我的演示者仍然拥有它的实例(这可能导致内存泄漏),并且我从View调用一个方法来设置接收到的一些数据从服务器。
3)在我的视图内,我使用 getActivity()方法中的上下文,该方法在此阶段将返回 null 。
我如何尝试解决此问题
1)当我分离片段时,我在演示者上调用 release()方法。在此方法内部,我考虑过将视图实例设置为null。这将起作用,但是随后我需要在演示者的所有位置添加字面量检查,以检查我的视图是否已设置为空。似乎不是最好的方法。
2)在我的观点(片段)中,在使用 getActivity()之前,请先检查其是否为null。但这并不能解决内存泄漏问题,因此我需要在我的Fragment(s)中的每一个地方逐字添加此检查;
你们有其他选择吗?当我的片段被分离时,以某种方式释放演示者是一种正确的方法吗?只要我的演示者在我的视图上调用某个方法时,我就可以确保该视图已附加到一个Activity上? EventBus是否是一个好方法?
非常感谢!
答案 0 :(得分:2)
presenter层的主要目标之一是独立于Android Framework,这意味着您无需从Android Framework导入任何包,从而使其成为纯Java类。您应该使Activity
或Fragment
实现ActivityView
接口或FragmentView
接口,并让具体的Activity
或Fragment
实现该接口。现在,在onCreate()
中创建演示者的实例,并将View(活动性或片段)作为参数传递,在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,则可以在CompositeDisposable
中拥有Presenter
对象,将网络调用添加到该一次性对象,并使用Activity
或Fragment
的适当生命周期方法,您当然可以通过dispose()
在compositeDisposable
上调用Presenter
方法。这样,您将清除所有正在进行的网络操作,如果没有UI,则不会更新UI。希望这个答案对您有帮助:)