Evitare IllegalStateException in MVP quando la vista non è ancora pronta

1

Nel tentativo di migliorare le mie capacità di codifica sto cercando di utilizzare il pattern MVP in una delle mie prime applicazioni Android. Sta andando bene, ma ho colpito un problema che non sono sicuro di quale sia il modo "corretto" per affrontare.

Ho una classe View che contiene un oggetto Mappa di Google. Contiene anche uno "spinner" che consente all'utente di selezionare tra una serie di modalità per centrare la mappa.

  • caso 0 è al centro di un particolare indicatore utente
  • il caso 1 è al centro del gruppo di marcatori

Quando l'utente seleziona una di queste modalità, il relatore viene avvisato e, a seconda della modalità, lavora con il modello per capire quale nuovo centro della mappa dovrebbe essere e poi dice alla vista di riavviare la mappa.

Il problema è che quando il dispositivo viene ruotato, l'intero "sistema" viene riavviato e una delle prime cose che accade è che il sistema Android imposta lo spinner sullo stato in cui si trovava prima di essere ruotato. Questo attiva il metodo più recente che tenta di aggiornare la mappa prima che sia pronta.

La mia soluzione rapida per questo era controllare qualcosa nella classe Model che dovrebbe essere vero solo se la mappa è pronta, cioè ci sono marcatori che dovrebbero essere già stati visualizzati.

public void centerOnModeSelected(int position) {
    centerOnModeIndex = position;
    if (mMapMarkers.size() > 0 ) recenterMap();

}

Quello che sto pensando di fare è questo:

Nel costruttore presenter, avrei un campo

private Boolean mapIsReadyForUpdates = false;

e un metodo

public void setMapIsReadyForUpdates() {
     mapIsReadyForUpdates = true;
}

e poi il metodo View chiamerà quel metodo dopo aver aggiunto alcuni indicatori alla mappa, o ogni volta che posso essere sicuro che sia pronto ad accettare i metodi che attualmente generano le eccezioni.

Suppongo che l'altra opzione sia quella di mantenere quello stato nella vista stessa e quindi bloccare le chiamate all'oggetto mappa in base allo stato della vista.

La mia attuale metodologia è di non mantenere lo stato di visualizzazione, il presentatore sta mantenendo lo stato.

Sto assumendo che gli altri abbiano affrontato le situazioni in MVP erano una vista in cui il mio non si trovava in uno stato dove potevano accettare chiamate a particolari metodi. Qualcuno può aiutarmi a capire i compromessi con le mie 3 soluzioni o suggerire una soluzione migliore?

La mia "correzione rapida" funziona, ma sembra un trucco. Se non ci sono marcatori non è necessario aggiornare la mappa, ma il fatto che esistano dei marcatori non significa che la mappa sia pronta per essere aggiornata.

Aggiorna

Poiché il relatore controlla completamente la vista, sa quando la mappa è pronta per essere aggiornata, quindi tutto ciò che dovevo fare era creare un campo nel presentatore (come menzionato sopra), e quindi impostarlo su true, una volta Ero sicuro di aver creato la mappa nella vista. Quindi controlla quel campo prima di chiamare qualsiasi metodo che proverebbe ad aggiornare la mappa. Immagino che questo abbia perfettamente senso per il pattern MVP.

    
posta nPn 01.08.2014 - 22:37
fonte

0 risposte

Leggi altre domande sui tag