我已经在Android中看到了两种实现MVP模式的方法。两者都在Android Architecture Blueprints中使用:
public interface Contract {
interface View {
void showData(String data);
}
interface StartVersionPresenter {
void start();
}
interface DropViewVersionPresenter {
void takeView(View view);
void dropView();
}
}
1)通过构造函数插入视图的演示者:
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);
}
});
}
}
start()
用onResume()
Fragment
的方法调用。
2)通过方法(在我的示例中为takeView
)插入视图的演示者:
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 view)
在Fragment
的{{1}}方法中被调用。
在onResume()
的{{1}}方法中调用dropView()
。
在两种情况下,演示者都是通过Fragment
的{{1}}方法创建的。
为什么在更多情况下而不是在第一种情况下使用第二种方法?我看到第一个比较简单,因为如果要在视图上调用该方法,则不必检查视图是否为null。