Tengo una Actividad con dos Fragmentos en ella.

La actividad (MainActivity) recupera los datos de un open api tiempo. He implementado el MVP de este, en el que:
Model contiene todos los objetos de respuesta de la API

View es el Activity

Presenter contiene MainPresenter, MainPresenterImpl, MainView, GetDataInteractor y GetDataInteractorImpl.

Así, la actividad obtiene los datos desde el servicio web. Ambos fragmentos se muestran los datos a partir de los datos obtenidos en la actividad.

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

  • Sólo un pensamiento: me gustaría considerar la posibilidad de que los fragmentos que se cuentan como puntos de vista (en cuanto a los MVP), por lo tanto me pregunto si sería extraño tener un presentador de referencia de múltiples puntos de vista (o mejor dicho: sus devoluciones de llamada de interfaz) para mostrar diferentes datos en la vista más adecuada para que? Yo pensaría que un presentador debe decidir/directo que muestra que los datos?P. s. Al parecer, varios presentadores de un punto de vista es un enfoque válido, así que tal vez al revés funciona así: stackoverflow.com/a/2068/1041533
  • en realidad, como se dijo aquí, programmers.stackexchange.com/a/261351/206366 MVP en cada presentador es el responsable de presentar un punto de vista. La única manera de que un presentador puede presentar varios puntos de vista es si los diferentes puntos de vista son simplemente diferentes implementaciones de una sola vista de la interfaz que se une a la presentadora.
  • gracias por el seguimiento – que de hecho tienen sentido!
InformationsquelleAutor DJ-DOO | 2015-12-13

1 Comentario

  1. 17

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

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

    El presentador debe ser responsable para llamar a la api de servicios.

    Así, el presentador debe exponer un método como loadXXX, internamente se iba a realizar la llamada al servicio. Cuando se recibe la respuesta, el presentador debe llamar view.showXXX con los resultados del servicio. La actividad/fragmento debe llamar a este loadXXX método y aplicar la showXXX.

    Generalmente, el presentador se crea o se inyecta en la actividad/fragmento.
    La actividad/fragmento tiene que implementar una interfaz expuestos por el ponente y el ponente tiene una referencia débil de esta interfaz, por lo que se puede devolución de llamada.

    Cuando el usuario interactúa con la pantalla, por ejemplo, un 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 para mostrar la carga, por ejemplo, view.showAsLoading() porque tiene que hacer sus cosas: tal vez la validación de algo o carga de datos desde un servicio de api y, finalmente, de devolución de llamada 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 el punto de 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);
        }
    
    }
    • señor, puede explicar por qué mWeakView es un WeakReference, ¿por qué motivos?
    • Esto es para evitar la retención de una referencia a la Actividad o Fragmento. El presentador hace async solicitudes a la Api. Si pulsa de nuevo o finalizar la actividad, mientras que el presentador está haciendo la solicitud y no se utiliza un WeakReference, el presentador se conservan de la Actividad/Fragmento de la memoria (retención de todos los puntos de vista y los miembros de que la Actividad o Fragmento). En lugar de utilizar un WeakReference, también es común para exponer una adjuntar y separar método en el presentador. Después de que se ejecuta el presentador debe llamar al método attach y cuando la Actividad/Fragmento del onDestroy se llama, usted debe llamar a separar.
    • Si usted no usa un WeakReference ni la de conectar/dettach enfoque y su actividad/fragmento fue destruido antes de que el presentador de la solicitud ha terminado, usted también podría tener problemas cuando la solicitud de acabados, porque se va a tratar de actualizar algo en la destrucción de la actividad/fragmento.
    • Estoy haciendo asociar/desasociar cosa. también cuando la aplicación está en pausa, me voy a detener todas las llamadas de la red, no sé si es correcto
    • Gracias por la amable respuesta. ¿Crees que uno debe tener diferentes presentador de la actividad y el fragmento. Dado que una actividad como la de las pestañas pueden tener numerosos fragmentos con una funcionalidad diferente. Es más limpio para cada fragmento tiene su propio presentador? En ese caso, si el fragmento del presentador tiene que comunicar a la actividad ¿cuál es la mejor manera de hacerlo? Sé que uno puede llamar método de actividad a través de una interfaz que fragmento de implementos, los cuales a su vez pueden llamar a la actividad del presentador. Sin embargo, ¿es demasiado?
    • Usted puede utilizar un presentador por fragmento si vale la pena o simplemente puede usar sólo uno de los presentadores con múltiples fragmentos. Usted siempre debe tratar de hacer sólo la interfaz de usuario de cosas en sus actividades/fragmentos y llamar al presentador de la actividad o de los fragmentos (si existen fragmento) cuando tiene que realizar una operación. Para comunicarse desde el fragmento a la actividad que se debe utilizar la normativa común de escucha de enfoque.
    • Gracias! Eso es útil. Si hay un código en el cual permite decir que uno es a través de programación a la adición de elementos de interfaz de usuario para el diseño existente, por lo que va en la actividad demasiado, ¿verdad?
    • Sí, absolutamente. Todo lo relacionados con la IU debe hacerse en la capa de la Vista: las actividades y los fragmentos. Como regla general, usted no debería tener ningún android importaciones en el presentador.
    • ¿qué es mWeakView.get();…?
    • devuelve el MyPresenter.View objeto que se establece en el constructor.
    • Lo que si tengo varias anidada fragmentos? Debo crear un presentador para cada uno de los fragmentos o me pueden llamar a la clase de conexión de los fragmentos directamente si tengo que seguir patrón MVP?
    • Si desea que cada fragmento para ser totalmente independientes y cada fragmento tiene, por ejemplo, realizar una solicitud de red, entonces te sugiero que para tener un moderador para cada fragmento. Si no, yo diría que sólo puede tener uno de los «principales» presentador en su «principal» de la actividad/fragmento y que cuando una acción se realiza en el anidada fragmento siempre se puede contar de su actividad del contenedor/fragmento acerca de ello y de que el recipiente de la llamada al método correspondiente de la presentadora.
    • bueno gracias por tu explicación

Dejar respuesta

Please enter your comment!
Please enter your name here