Android MVP 发布 Presenter 的正确方法
Android MVP Proper Way to Release Presenter
我正在使用 MVP 架构,并且一直在研究如何正确发布演示者。首先,让我告诉你们发生了什么事。
问题
1) 我的演示者发出异步服务器请求。
2) 当我收到服务器响应时,我的视图(片段)已经分离,但我的演示者仍然持有它的实例(这可能导致内存泄漏),我从 View 调用一个方法来设置一些数据我从服务器收到了。
3) 在我的视图中,我使用来自 getActivity() 方法的上下文,在这个阶段将 return 空.
我是如何解决这个问题的
1) 当我分离片段时,我在演示者上调用 release() 方法。在这个方法中,我考虑过将我的视图实例设置为 null。这会起作用,但是我需要在我的演示者的任何地方添加空检查,检查我的视图是否已经设置为空。似乎不是最好的方法。
2)在我看来(片段),在使用它之前检查getActivity()是否为null。但它并没有解决内存泄漏问题,我需要在我的片段中的任何地方添加这个检查;
你们有其他选择吗?当我的片段以某种方式分离时,这是释放我的演示者的正确方法吗?每当我的演示者在我的视图上调用方法时,我将确保该视图附加到 Activity? EventBus 是一个好的方法吗?
非常感谢!
presenter 层的主要目标之一是 Android 框架独立,这意味着您不需要从 Android 框架导入任何包,使其成为纯粹 Java class。您应该让 Activity
或 Fragment
实现 ActivityView
接口或 FragmentView
接口,并让具体的 Activity
或 Fragment
实现该接口。现在,在 onCreate()
中,您创建了一个演示者实例并将视图(Activtity 或 Fragment)作为参数传递,而在 Presenter class 中,您将拥有 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。希望这个答案对你有帮助:)
我正在使用 MVP 架构,并且一直在研究如何正确发布演示者。首先,让我告诉你们发生了什么事。
问题
1) 我的演示者发出异步服务器请求。
2) 当我收到服务器响应时,我的视图(片段)已经分离,但我的演示者仍然持有它的实例(这可能导致内存泄漏),我从 View 调用一个方法来设置一些数据我从服务器收到了。
3) 在我的视图中,我使用来自 getActivity() 方法的上下文,在这个阶段将 return 空.
我是如何解决这个问题的
1) 当我分离片段时,我在演示者上调用 release() 方法。在这个方法中,我考虑过将我的视图实例设置为 null。这会起作用,但是我需要在我的演示者的任何地方添加空检查,检查我的视图是否已经设置为空。似乎不是最好的方法。
2)在我看来(片段),在使用它之前检查getActivity()是否为null。但它并没有解决内存泄漏问题,我需要在我的片段中的任何地方添加这个检查;
你们有其他选择吗?当我的片段以某种方式分离时,这是释放我的演示者的正确方法吗?每当我的演示者在我的视图上调用方法时,我将确保该视图附加到 Activity? EventBus 是一个好的方法吗?
非常感谢!
presenter 层的主要目标之一是 Android 框架独立,这意味着您不需要从 Android 框架导入任何包,使其成为纯粹 Java class。您应该让 Activity
或 Fragment
实现 ActivityView
接口或 FragmentView
接口,并让具体的 Activity
或 Fragment
实现该接口。现在,在 onCreate()
中,您创建了一个演示者实例并将视图(Activtity 或 Fragment)作为参数传递,而在 Presenter class 中,您将拥有 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。希望这个答案对你有帮助:)