java - medium - mvp course android
¿En MVP es responsabilidad onClick de Ver o Presentador? (2)
En MVP, es responsabilidad de la Vista saber cómo capturar el clic, no decidir qué hacer con él. Tan pronto como la Vista captura el clic, debe llamar al método relevante en el Presentador para actuar sobre él:
------------------- Ver --------------------
button1.setOnClickListener(new OnClickListener({
presenter.doWhenButton1isClicked();
}));
------------------ Presenter ----------------
public void doWhenButton1isClicked(){
// do whatever business requires
}
Tengo una serie de artículos sobre patrones arquitectónicos en Android, parte 3 de los cuales trata sobre MVP. Puede que le resulte útil.
En el patrón de MVP, ¿quién es responsable de manejar los clics en la interfaz de usuario?
Por ejemplo, el enfoque no MVP sería algo como:
counterButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
totalClicks++;
counterTextView.setText("Total clicks so far: "+totalClicks);
}
});
¿Usar MVP es el onClick
responsabilidad del Presenter
? ¿O la View
puede manejar eso?
¿Puede alguien aclarar esto?
OnClick debería llamar a un método Presenter
. Debe hacer su trabajo en presentador y si necesita actualizar la interfaz de usuario debe definir un método en su View
y llamarlo desde el presentador.
Necesitas un método para tu View
ex:
public void showCounterCount(final int totalClicks){
counterTextView.setText("Total clicks so far: "+totalClicks);
}
También necesitas un método y una variable en tu Presenter
:
int totalClicks = 0;
public void onCounterButtonClicked(){
totalClicks++;
mView.showCounterCount(totalClicks);
}
Y refactoriza tu código así:
counterButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
mPresenter.onCounterButtonClicked();
}
});
Para una arquitectura más compleja y limpia, puede hacer su negocio de casos de uso en interactores. (En su ejemplo, incrementar un valor de contador es un caso de uso para su aplicación)
Puede definir un interactor e incrementar su valor de contador allí.
CounterInteractor:
public CounterInteractor{
public int incrementCounter(int currentCounter){
return currentCounter+1;
}
}
Y refactoriza a tu presentador como abajo:
int totalClicks = 0;
CounterInteractor mCounterInteractor = new CounterInteractor();
public void onCounterButtonClicked(){
totalClicks = mCounterInteractor.incrementCounter(totalClicks);
mView.showCounterCount(totalClicks);
}
Con este enfoque, separa su lógica de negocios totalmente de los presentadores y reutiliza los conceptos de su caso de uso sin duplicar el código en los presentadores. Este es un enfoque más limpio.
También puede consultar este repositorio de git para diferentes enfoques de MVP. https://github.com/googlesamples/android-architecture/tree/todo-mvp-clean/
Buena suerte.
Editar:
Aquí está mi fuente de proyecto de cliente ligero de wikipedia: https://github.com/savepopulation/wikilight
Estoy tratando de implementar MVP
. (MVP + Dagger2 + RxJava)