Подтвердить что ты не робот

MVP для активности с несколькими фрагментами

У меня есть Activity с двумя фрагментами в нем.

Активность (MainActivity) извлекает данные из открытой погоды api. Я внедрил MVP для этого, в котором: Model содержит все объекты ответа из API
View - это Activity
Presenter содержит MainPresenter, MainPresenterImpl, MainView, GetDataInteractor и GetDataInteractorImpl.

Таким образом, активность получает данные из веб-службы. Оба фрагмента будут отображать данные из данных, полученных в ходе операции.

Какова наилучшая практика использования MVP в этой ситуации? Я знаю, как передавать данные между фрагментами ↔ activity через интерфейс/обратные вызовы, мой вопрос заключается в изменении этого поведения при реализации MVP?

4b9b3361

Ответ 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);
    }

}