MVP para la actividad con múltiples fragmentos

Tengo una actividad con dos fragmentos en ella.

La actividad ( MainActivity ) recupera datos de un api de tiempo abierto. He implementado MVP para esto en el que: Model contiene todos los objetos de respuesta de la API
View es la Activity
Presenter contiene MainPresenter , MainPresenterImpl , MainView , GetDataInteractor y GetDataInteractorImpl .

Por lo tanto, la actividad obtiene los datos del servicio web. Ambos fragmentos mostrarán datos de los datos recuperados en la actividad.

¿Cuál es la mejor práctica usando MVP en esta situación? Sé cómo pasar datos entre fragmentos <-> actividad a través de interfaz / callbacks, mi pregunta es ¿este cambio de comportamiento al implementar MVP?

La actividad / fragmentos deben ser considerados como sólo la vista en el modelo MVP. Esto significa que sólo deben mostrar datos y recibir interacciones del usuario. Está bien para comunicar la actividad y fragmentos a través de interfaz / callbacks.

Pero, no es una responsabilidad de actividad / fragmento llamar a los servicios de la API.

El presentador debe ser responsable de llamar a los servicios de api.

Por lo tanto, el presentador debe exponer un método como loadXXX , internamente haría la llamada al servicio. Cuando se recibe la respuesta, el presentador debe llamar a view.showXXX con los resultados del servicio. La actividad / fragmento debe llamar a este método loadXXX e implementar el showXXX .

Normalmente, el presentador se crea o se inyecta en la actividad / fragmento. La actividad / fragmento tiene que implementar una interfaz expuesta por el presentador, y el presentador sostiene una referencia débil de esta interfaz, para que pueda devolver la llamada.

Cuando el usuario interactúa con la pantalla, por ejemplo, una onClick en un botón, la actividad / fragmento llama al método correspondiente en el presentador, por ejemplo presenter.loadUserDetails() el presentador le dice a la vista que muestre como carga, por ejemplo, view.showAsLoading() Porque tiene que hacer sus cosas: tal vez la validación de algo o la carga de datos de un servicio api y, finalmente, callback con los resultados a la vista, por ejemplo, view.showUserDetails(userDetails) .

Para resumir, un ejemplo, en el código de las diversas partes de MVP:

Actividad / Fragmento representa sólo la vista de 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) { ... } } 

Modelo:

 public class UserDetails { ... } 

Presentador:

 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, eg make the Api call and finally call view.showUserDetails(userDetails); } } interface View { void showAsLoading(); void showUserDetails(UserDetails userDetails); } } 
  • Cómo inyectar un presentador en una vista (patrón MVP) usando Dagger2
  • Realización de Interactors con Android MVP Clean Architecture
  • ¿Dónde colocar BroadcastReceiver en Android MVP?
  • Problemas al definir el patrón MVP para las aplicaciones de Android
  • Android MVP, donde comprobar la conexión a Internet
  • MVP para Android: uso seguro Contexto en Presenter
  • MVP de Android: cómo comunicarse entre el presentador de la actividad y el presentador de fragmentos
  • Dificultades para implementar Model-View-Presenter en Android
  • Android MVP open Actividad de Presenter, anti-pattern?
  • Implementación de MVP en la aplicación de Android
  • MVP Android - ¿Cuántos presentadores?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.