2010-12-12 6 views
39

Sono nuovo nello sviluppo di java! Qualcuno potrebbe dirmi ... in base a quale logica super.onDestroy(); in distruttori va in cima? per esempio:Perché super.onDestroy() in java - Android va in cima ai distruttori?

protected void onDestroy() {   
    super.onDestroy(); 
    releaseMediaPlayer(); 
} 

e non

protected void onDestroy() {   
    releaseMediaPlayer(); 
    super.onDestroy(); 
} 

come C++, obj-c, Pascal, ecc ??

risposta

53

Dipende veramente da cosa si desidera fare nel proprio onDestroy. Questo è ciò che fa super.onDestroy (nell'ordine indicato):

  • Ignora qualsiasi finestra di dialogo gestita dall'attività.
  • Chiudere tutti i cursori gestiti dall'attività.
  • Chiudere qualsiasi ricerca aperto dialogo

Se la logica si mettere dentro onDestroy ha qualcosa a che fare con quelle tre cose che Android fa, allora potrebbe essere necessario preoccuparsi dell'ordine. Altrimenti, e nella maggior parte dei casi, non importa.

+1

dove hai trovato questa informazione? Sono curioso di servizi, ecc. –

+1

Android è OpenSouce ... basta dare un'occhiata al codice sorgente: P – Cristian

5

Qual è la tua domanda? Puoi farlo in entrambi i modi, dipende se vuoi che la tua superclasse sia chiamata onDestroy() prima della tua. Di solito non penso che importi in Android.

Inoltre, onDestroy() non è un distruttore. In realtà non distrugge l'oggetto. È solo un metodo che si chiama basato su un certo stato. Quindi la tua istanza è ancora viva e molto bene * dopo che la onDestroy() della superclasse esegue e restituisce.

* Molto probabilmente, Android è libero di uccidere l'attività in qualsiasi momento, ma si può presumere che sia ancora lì.

+4

in C++, ad esempio, si distrugge la classe super dopo aver terminato la pulizia dei propri oggetti privati. se distruggi prima la super classe, non penso che sia una buona pratica, penso addirittura che l'app si arresterà in modo anomalo poiché l'istanza verrà distrutta! – Vassilis

+0

Come ha detto, questo non è un distruttore, sta solo dicendo al componente di pulire qualsiasi stato voglia. L'oggetto rimane ancora dopo la chiamata onDestroy(). Generalmente l'ordine non ha importanza e non causerà un arresto anomalo. – hackbod

6

Nel ThreadSample.zip sul Reporting Work Status training, c'è un commento a OnDestroy()

public void onDestroy() { 
    ... 
    // Must always call the super method at the end. 
    super.onDestroy(); 
} 

Quindi, forse, quando si utilizza Broadcast ricevitori, il super deve andare alla fine.

+2

Ha senso. Se vuoi fare * qualsiasi cosa * certamente non vuoi farlo su un oggetto semidistrutto (ripulito). – vbence

2

Dato che ci stiamo estendendo dalle classi Android base, è sempre un buon approccio lasciare che la classe genitrice crei e inizializzi prima durante la creazione e lasci che il bambino non inizializzi e liberi la risorsa prima durante l'arresto/l'arresto dei componenti. Questo è l'approccio raccomandato da seguire. tuttavia, dipende interamente dai casi d'uso e dagli scenari.

public void onCreate(Bundle bundle){ 
    super.onCreate(bundle); 
    //perform child class initializations. 
} 

public void onDestroy(){ 
    //perform uninitialization and free resource 
    super.onDestroy(); 
} 
Problemi correlati