2011-02-10 5 views
6

Ho un'attività che potrebbe avere thread in esecuzione quando l'utente preme indietro e termina() l'attività. Cosa succede a quei fili a quel punto? Cercheranno tutti di completare a meno che non li interrompo in onDestroy()?Cosa succede ai thread e alle visualizzazioni di un'attività quando viene distrutta?

Ad esempio, il codice seguente non è sicuro, perché le mie visualizzazioni e il cursore possono essere distrutti se l'attività termina prima del thread?

Il motivo per cui chiedo è che ho occasionalmente arresti anomali durante le attività che non ho ancora eseguito correttamente il debug, perché si verificano raramente e mai mentre sono in modalità di debug. Da allora ho iniziato a controllare se i miei oggetti vista sono nulli prima di fare qualcosa per loro in runOnUIThread(). Non sono sicuro se questa è la soluzione più pulita, o se questo è il problema.

new Thread()(
public void run(){ 
    crunchOnSomethingForAwhile(mCursor); 
    MyActivity.this.runOnUIThread(new Runnable(){ 
     public void run(){ 
      mTextView.setText("thread complete"); 
      mCursor.close(); 
     } 
    } 
} 
).start(); 
+0

Che cosa dice LogCat quando si verificano questi arresti anomali? – alexanderblom

+0

Sono accaduti solo quando ero lontano dal mio computer, quindi non ero connesso a LogCat. Forse mi manca qualcosa di veramente semplice, ma quando provo a scaricare il mio log più tardi nella console di Windows, ottengo solo le ultime due pagine di log nella finestra della console - immagino che stia finendo la stanza. Hai bisogno di capire come scaricare il file come file sul mio PC. – Tenfour04

risposta

1

Qualcuno ha postato una risposta su un altro thread che onDestroy imposta tutti i riferimenti di vista su null e infine il riferimento di attività su null. Quindi supporrò che è meglio interrompere tutti i thread in esecuzione su onDestroy, o almeno catturare NullPointerExceptions in qualsiasi metodo runInUIThread.

1

vorrei guardare utilizzando AsyncTask invece di un semplice Thread. Ha un supporto integrato per fare il lavoro in un altro thread, e quindi alla fine di fare qualcosa sul thread dell'interfaccia utente.

Detto questo, ci sono una serie di thread in giro che parlano di come comportarsi con AsyncTask s quando l'attività finisce. Cosa esattamente dovresti fare dipende da cosa sta facendo il compito. Se è applicabile solo a quell'attività, è possibile annullare l'attività in onPause (assumendo che non si tratti solo di un cambio di rotazione).

Altrimenti, ci sono varie tattiche per mantenere gli AsyncTasks attraverso le Attività. Vedi questo question per alcune idee. Questo commonsware blog ha anche un esempio di trattenimento su un AsyncTask attraverso una rotazione dello schermo.

+0

Grazie per le informazioni. Sono un po 'bloccato in thread invece di asynctask, perché sto usando l'SDK di Facebook, che è scritto principalmente con thread, e non voglio riscriverne un sacco se posso evitarlo. Non è un grosso problema, ma non vedo ancora alcun vantaggio nel cambiarlo. Indipendentemente da ciò, sembra che il risultato su UIThread sarebbe simile. La manipolazione di una vista in un'attività distrutta è pericolosa? – Tenfour04

+0

Non l'ho ancora provato, ma sembra molto probabile che provare a manipolare una vista in un'attività distrutta avrebbe conseguenze non volute. –

Problemi correlati