Aiuta a comprendere / implementare l'architettura MVP in Android

2

Sto cercando di decifrare / comprendere il modo migliore per implementare l'architettura Model-View-Presenter per la seguente app di esempio Android ...

L'app:

Sto tentando di implementare un'app meteo molto semplice utilizzando MVP ma sono perso senza speranza sul modo migliore per implementare il pattern. L'app è composta da due attività: MainActivity e WeatherActivity. MainActivity ha un EditText per consentire all'utente di inserire manualmente la propria posizione, un pulsante che l'utente può premere per ottenere la posizione corrente del dispositivo e un pulsante per recuperare i dati meteo per la posizione. Una volta che i dati meteo sono stati recuperati, viene avviato ViewWeatherActivity e i dati vengono visualizzati all'utente.

Ecco come sto pensando di implementarlo, ma posso già vedere alcuni problemi (ne parlerò di più alla fine) e penso che potrei complicare troppo le cose e / o semplicemente ottenerlo in modo orribilmente sbagliato ...

La vista:

So che c'è qualche discussione in merito, ma ho deciso di rendere MainActivity the View, in quanto conosce tutto il framework e gestisce l'interfaccia utente, ecc. La View convaliderà l'input dell'utente (ad esempio, verifica che siano entrati in una posizione ecc.) e poi chiedere al Presentatore (tramite un'interfaccia) di recuperare i dati meteorologici. La vista implementerà anche la propria interfaccia per ricevere i dati in arrivo.

Presentatore:

Questa è una classe non attiva che implementa due interfacce. Uno per ricevere richieste dalla vista e una per ricevere dati dal modello. Il presentatore, ad esempio, chiederà al modello di ottenere i dati JSON non elaborati per una data posizione dall'API meteo. Una volta ricevuto, Presenter formatterà i dati per il consumo dalla vista, quindi li consegnerà alla vista tramite l'interfaccia della vista.

Il modello:

Il Modello implementerà un'interfaccia per gestire le richieste in arrivo dal Presenter. Ad esempio, risponderà a una richiesta (passata dalla View tramite Presenter) per ottenere la posizione corrente del dispositivo. È anche responsabile della comunicazione con l'API meteo per recuperare i dati richiesti. I dati recuperati dal modello verranno passati al Presenter tramite un'interfaccia.

Ecco un rapido (molto semplice!) diagramma che illustra quanto sopra:

L'enigma di posizione:

Questo è un problema che ho già identificato con l'implementazione di cui sopra. L'utilità che sto usando per gestire la funzionalità di localizzazione è un wrapper attorno all'API FusedLocationProviderClient di Google Play Services, il che significa che ha bisogno di un contesto di attività. Avere la funzionalità di localizzazione gestita dal modello richiederebbe un riferimento all'attività chiamante da tenere, potenzialmente risultante in una brutta perdita di memoria. Ma, spostando la funzionalità di localizzazione nella vista, ad esempio, si otterrebbe una sorta di sconfitta dell'oggetto di avere solo la logica dell'interfaccia utente nella vista, no? O nelle circostanze è accettabile? Esiste un modo alternativo per gestire funzionalità di localizzazione che si adattino al paradigma MVP in modo più sintetico?

Quindi, cosa ne pensi? Sto abbaiando completamente dall'albero sbagliato o c'è qualche merito nella mia pianificata implzione? Come può essere migliorato, reso più efficiente, meno complicato, ecc.? Qualsiasi consiglio e critica costruttiva sarà molto apprezzato. Grazie.

    
posta DoTheDonkeyKonga 25.09.2018 - 22:34
fonte

0 risposte

Leggi altre domande sui tag