2011-01-28 12 views
43

Attualmente sto sviluppando alcune app Android in un team e negli ultimi mesi abbiamo utilizzato 2 approcci diversi (uno che preferisco personalmente e l'altro che preferisce l'altro sviluppatore).Android: raccomandazioni AsyncTask: classe privata o classe pubblica?

Anche se finora i risultati sono gli stessi, questo mi ha fatto chiedo ... dovremmo:

  • uso AsyncTasks come lezioni private all'interno delle attività che li utilizzano.
  • o di usare AsyncTasks come classi pubblici separati che ricevono il contesto dell'attività

sono una delle approachs consigliati da Google?

Che cosa dice la tua esperienza in merito (vantaggi, svantaggi, problemi)?

risposta

35

Le classi interne sono buone per rappresentare oggetti che sono intesi come privati ​​o in qualche modo intimamente legati alla classe che li ospita. Occasionalmente ci sono ragioni tecniche per l'uso di classi interne (ad es. Simulazioni di chiusure). Hanno anche ridotto l'inquinamento dello spazio dei nomi.

Uno svantaggio delle classi interne è che se accedono a membri privati ​​(campi o funzioni) della classe che li include, il compilatore genererà le funzioni di accesso a tali membri. I puristi della lingua discuteranno se questa rottura dell'incapsulamento sia una buona cosa o una brutta cosa. Le funzioni di accesso aggiungono un po 'di overhead ad ogni accesso (che di solito non è un fattore, ma è così). Un altro svantaggio è che rende il file sorgente più complesso e quindi più difficile da gestire. (Di tanto in tanto sono stato punito modificando una funzione nella classe interna mentre pensavo che fosse nella classe esterna, e viceversa.) Infine, le classi interne tendono a non essere riusabili, mentre le classi separate possono spesso essere parametrizzate per avere molteplici usi .

questi pro e contro sono fuori dalla parte superiore della mia testa. Sono sicuro che altri avranno pensieri aggiuntivi.

UPDATE:

In questo Google IO video l'opzione AsyncTask interna è chiaramente indicato come opzione sbagliata.

+1

Dopo un po 'di utilizzo come classi pubbliche separate vedo che è molto più utile. – neteinstein

+14

@NeTeInStEiN - Per un AsyncTask, una classe interna (rispetto a una classe statica nidificata) è sempre errata per motivi tecnici: un'attività può essere eliminata (a causa di una modifica della configurazione) senza arrestare AsyncTask. Se AsyncTask fosse una classe interna, ciò causerebbe la perdita della vecchia attività perché AsyncTask avrebbe un riferimento (nascosto) all'istanza della classe esterna. Alcuni cambiamenti di orientamento del telefono causerebbero quindi la morte del processo a causa dell'esaurimento della memoria. per una soluzione al problema (molto comune) di AsyncTask in possesso di un riferimento ad un'attività –

7

Non importa, utilizza ciò che ha più senso per il tuo codice. L'importante è osservare un'attività asincrona che contiene un riferimento su un'attività dopo che l'attività è stata distrutta, implicitamente come una classe interna dell'attività, o esplicitamente dato l'oggetto attività/contesto.

+4

Vedi [discussione] (https://groups.google.com/forum/#!starred/android-developers/vwRrlc84gy0). –

Problemi correlati