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
.
- ¿En MVP está onClick la responsabilidad de View o Presenter?
- Android MVP - ¿Debería evitar el uso de referencias R.string en el presentador?
- MVP de Android con Dagger 2 - Actividad con múltiples fragmentos
- RxJava con presentador y fragmento retenido para cambios de configuración
- Explicación de Android MVP
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?
- Realm, RxJava, asObservable () y doOnUnsubscribe ()
- ¿Es una buena idea utilizar Service as Presenter en el contexto MVP
- MVP, establecer la opinión del presentador de nulo en destruir?
- MVP para Android: ¿Qué es un Interactor?
- Android MVP - puedo tener múltiples presentadores para vistas personalizadas y fragmentos
- Comentarios sobre mi patrón MVP para Android
- ¿El desarrollo de la interfaz de usuario de Android se presta bien a un patrón de diseño participativo?
- ¿Cómo inicio un servicio desde mi Interactor usando el patrón MVP en android?
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); } }
- Error al convertir @ drawable / en un drawable
- ¿Cómo comprobar las aplicaciones actuales en ejecución en Android?