Ответ 1
Активность/фрагменты следует рассматривать как просто представление в модели MVP. Это означает, что они должны просто показывать данные и получать пользовательские взаимодействия. Достаточно сообщать активность и фрагменты через интерфейс/обратные вызовы.
Но это не ответственность за действие/фрагмент, чтобы вызвать службы API.
Ведущий должен нести ответственность за вызов служб api.
Итак, ведущий должен выставить такой метод, как loadXXX
, внутренне он сделает вызов этой услуги. Когда ответ получен, ведущий должен вызвать view.showXXX
с результатами службы. Действие/фрагмент должен вызывать этот loadXXX
метод и реализовать showXXX
.
Обычно ведущий создается или вводится в действие/фрагмент. Действие/фрагмент должен реализовывать интерфейс, открытый презентатором, и ведущий имеет слабую ссылку на этот интерфейс, чтобы он мог обратный вызов.
Когда пользователь взаимодействует с экраном, например, onClick
на кнопке, активность/фрагмент вызывает соответствующий метод в ведущем устройстве, например. presenter.loadUserDetails()
ведущий сообщает, что представление отображается как загрузка, например. view.showAsLoading()
, потому что он должен делать свои вещи: возможно, что-то проверять или загружать данные из службы api и, наконец, обратный вызов с результатами в представление, например. view.showUserDetails(userDetails)
.
Подводя итог, пример, в коде различных частей MVP:
Activity/Fragment представляет только представление MVP:
public class MyActivity extends AppCompatActivity implements MyPresenter.View {
private MyPresenter mPresenter;
public onCreate() {
...
mPresenter = new MyPresenter(this); // Or inject it and then set the view.
}
public void onClick(View v) {
mPresenter.loadXXX(param1, param2);
}
// MyPresenter.View methods
public void showAsLoading() {
...
}
public void showUserDetails(UserDetails userDetails) {
...
}
}
Модель:
public class UserDetails {
...
}
Ведущий:
public class MyPresenter {
private WeakReference<MyPresenter.View> mWeakView;
public MyPresenter(MyPresenter.View view) {
mWeakView = new WeakReference(view);
}
public void loadXXX(String param1, String param2) {
MyPresenter.View view = mWeakView.get();
if (view != null) {
view.showAsLoading();
// Do stuff, e.g. make the Api call and finally call view.showUserDetails(userDetails);
}
}
interface View {
void showAsLoading();
void showUserDetails(UserDetails userDetails);
}
}