Я видел два подхода к паттерну MVP в Android.Оба используются в Чертежах архитектуры Android :
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
onResume()
.dropView()
вызывается в методе Fragment
onDestroy()
.
В обоих случаях ведущий создается в методе Fragment
* onCreate()
.
Почему второйподход используется в большем количестве случаев, чем первый?Я вижу, что первое проще, потому что нам не нужно проверять, что представление не является нулевым, если мы хотим вызвать метод для него.