7

Dopo aver letto l'articolo Avoiding memory leaks da @RomainGuy ho capito che la mia attuale applicazione Android è afflitta dall'errore di passare l'attività principale dell'applicazione. Quindi ogni volta che posso, posso semplicemente sostituire quel parametro di attività con Activity.getApplicationContext().Sequenza di comando per passare i metodi di attività dell'applicazione?

Ma ci sono alcune classi nella mia applicazione che hanno ancora bisogno di eseguire metodi che possono essere solo membri dell'attività principale dell'applicazione.

Così stavo pensando di utilizzare eventualmente il Command Pattern per risolvere questo limite.

Il problema è che, se guardiamo l'esempio:

public class SomeCommandExecuableOnlyByActivity implements Command 
{ 
    public void execute(Object data) 
    { 
     doIt(((MyActivity)data).getWindow()); 
    }  
} 

Sono in esecuzione di nuovo nel vicolo cieco di avere bisogno del passaggio intorno all'attività (questa volta travestito da dati Object).

Come uscire da questa situazione "chicken & the egg"?

C'è un modo migliore per affrontare questo problema?

+6

Non c'è nulla in quell'articolo che afferma che "passare l'attività principale dell'applicazione" è un errore. Inserirlo in membri di dati statici * è * un errore, e questo è il problema principale dietro il suo primo e terzo proiettile nella parte inferiore dell'articolo. IMHO, usa "Applicazione" solo quando sai esattamente e precisamente perché lo stai usando. Non è una sostituzione di coperta per 'Activity', in particolare per il lavoro di interfaccia utente. – CommonsWare

+2

@CommonsWare Grazie per aver segnalato questa significativa differenza. Nel mio caso tengo un membro di dati SharedPreferences statico nella mia attività principale per un facile accesso da parte dei vari moduli nell'applicazione. Così posso accedere alle preferenze condivise evitando di passare l'attività principale come parametro: 'MainActivity.staticPrefs'. È considerato "* Inserendolo in dati statici membri"? – ih8ie8

+1

Questa è una buona domanda. Dato che 'SharedPreferences' è un'interfaccia, e non vedo facilmente dove sia l'implementazione concreta, non lo so. Se 'SharedPreferences' si tiene su un' Context' - e potrebbe - allora dovresti usare 'Applicazione' o evitare il membro statico dei dati. Mi aspetto che 'Application' funzioni correttamente con un' SharedPreferences'. – CommonsWare

risposta

3

Penso che quello che potrebbe mancare qui è una giusta separazione delle preoccupazioni. Se dici che devi passare la tua attività principale ad altre attività per richiamare alcune funzionalità su di essa, allora mi sembra che l'architettura della tua app abbia alcuni difetti di progettazione fondamentali.

Se non utilizzare lo schema di comando qui non lo so, ma quello che farei in genere è identificare quei metodi che richiedono l'accesso condiviso, spostarli in una classe separata e quindi tenere un'istanza separata di quella classe in tutte le attività che richiedono questa funzionalità o se è necessario condividere lo stato dell'istanza, crearla nel contesto dell'applicazione globale e fornire un percorso di accesso globale (non desiderabile, ma senza un framework DI come RoboGuice è molto difficile implementare DI su Android, poiché i costruttori sono resi nulli.)

A mio parere, in un'applicazione Android ben progettata, un'attività è priva di logica aziendale e fornisce solo operazioni che modificano lo stato dell'interfaccia utente. Il flusso dell'interfaccia utente o di qualsiasi altro calcolo verrebbe lasciato ad altre classi. Lo Model-View-Presenter pattern aiuta enormemente a mantenere il codice strutturato in base alla responsabilità.

Senza darci più informazioni su ciò che stai cercando di ottenere, è difficile dare un consiglio specifico.

Problemi correlati