studio practices medium guidelines example best android android-fragments interface mvp

android - practices - MVP para la actividad con mĂșltiples fragmentos



mvp android example (1)

Tengo una Actividad con dos Fragmentos en ella.

La actividad ( MainActivity ) recupera datos de una API abierta. Implementé MVP para esto en el cual: Model contiene todos los objetos de respuesta de la API
View es la Activity
Presenter contiene MainPresenter , MainPresenterImpl , MainView , GetDataInteractor y GetDataInteractorImpl .

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

¿Cuál es la mejor práctica al usar MVP en esta situación? Sé cómo pasar datos entre fragmentos <-> actividad a través de interfaz / devoluciones de llamada, mi pregunta es, ¿este comportamiento cambia cuando se implementa MVP?


La actividad / fragmentos deben considerarse solo como la vista en el modelo MVP. Esto significa que solo deben mostrar datos y recibir interacciones del usuario. Está bien comunicar actividad y fragmentos a través de interfaz / devoluciones de llamada.

Sin embargo, no es una responsabilidad de actividad / fragmento llamar a los servicios API.

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

Entonces, el presentador debería 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 debería llamar a este método loadXXX e implementar el showXXX .

Por lo general, 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 contiene una referencia débil de esta interfaz, de modo que puede devolverla.

Cuando el usuario interactúa con la pantalla, por ejemplo, un clic 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 se muestre como carga, por ejemplo, view.showAsLoading() porque tiene que hacer todo lo posible: tal vez validar algo o cargar datos de un servicio de API y finalmente view.showUserDetails(userDetails) 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 solo 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, e.g. make the Api call and finally call view.showUserDetails(userDetails); } } interface View { void showAsLoading(); void showUserDetails(UserDetails userDetails); } }