Java MVP-演示者比较:构造函数中注入的视图与takeView(视图v)/dropView()中的视图
我在Android中见过两种MVP模式。两者都用于: 1) 通过构造函数注入视图的演示者:Java MVP-演示者比较:构造函数中注入的视图与takeView(视图v)/dropView()中的视图,java,android,dependency-injection,mvp,android-mvp,Java,Android,Dependency Injection,Mvp,Android Mvp,我在Android中见过两种MVP模式。两者都用于: 1) 通过构造函数注入视图的演示者: public class StartVersionPresenter implements Contract.StartVersionPresenter { private final Contract.View view; private final Repository repository; public StartVersionPresenter(Contract.Vi
public class StartVersionPresenter implements Contract.StartVersionPresenter {
private final Contract.View view;
private final Repository repository;
public StartVersionPresenter(Contract.View view, Repository repository) {
this.view = view;
this.repository = repository;
}
@Override
public void start() {
loadData();
}
private void loadData() {
repository.getData(new DataCallback() {
@Override
public void onDataLoaded(String someData) {
view.showData(someData);
}
});
}
}
public class DropViewVersionPresenter implements Contract.DropViewVersionPresenter {
private final Repository repository;
private Contract.View view;
public DropViewVersionPresenter(Repository repository) {
this.repository = repository;
}
@Override
public void takeView(Contract.View view) {
this.view = view;
loadData();
}
@Override
public void dropView() {
view = null;
}
private void loadData() {
repository.getData(new DataCallback() {
@Override
public void onDataLoaded(String someData) {
if (view != null)
view.showData(someData);
}
});
}
}
start()
在onResume()
Fragment
的方法中调用
2) 通过方法注入视图的演示者(takeView
,在我的示例中):
public class StartVersionPresenter implements Contract.StartVersionPresenter {
private final Contract.View view;
private final Repository repository;
public StartVersionPresenter(Contract.View view, Repository repository) {
this.view = view;
this.repository = repository;
}
@Override
public void start() {
loadData();
}
private void loadData() {
repository.getData(new DataCallback() {
@Override
public void onDataLoaded(String someData) {
view.showData(someData);
}
});
}
}
public class DropViewVersionPresenter implements Contract.DropViewVersionPresenter {
private final Repository repository;
private Contract.View view;
public DropViewVersionPresenter(Repository repository) {
this.repository = repository;
}
@Override
public void takeView(Contract.View view) {
this.view = view;
loadData();
}
@Override
public void dropView() {
view = null;
}
private void loadData() {
repository.getData(new DataCallback() {
@Override
public void onDataLoaded(String someData) {
if (view != null)
view.showData(someData);
}
});
}
}
takeView(Contract.View视图)
在Fragment
的onResume()方法中调用。
dropView()
在Fragment
的onDestroy()方法中调用
在这两种情况下,演示者都是在Fragment
的onCreate()方法中创建的
为什么在更多的情况下使用第二种方法而不是第一种?我可以看到第一个更简单,因为如果我们想调用视图上的方法,就不必检查视图是否为null