2011-07-01 9 views
7

La mia applicazione utilizza uno HandlerThread per alcune operazioni condivise tra componenti che devono essere eseguiti su un thread in background. La maggior parte delle volte questa discussione sarà nel suo stato di attesa.Necessario per uscire da un HandlerThread?

Posso lasciare questo HandlerThread in esecuzione (in attesa) nella mia richiesta, l'invio di messaggi ad esso in caso di necessità, ma mai smettere via HandlerThread.getLooper().quit()? Ciò potrebbe significare che questo HandlerThread continuerà a esistere nel suo stato di attesa anche dopo che tutti i miei componenti dell'applicazione sono stati distrutti.

Inizialmente questo sembrava un grosso no per me, qualcosa che non avrei assolutamente voluto fare, ma non ne sono sicuro ora. Quando Android uccide il mio processo, come farà quando è necessario liberare il tempo o la memoria della CPU, finirà questo thread insieme al mio thread dell'interfaccia utente. Inoltre, il thread sarà in attesa, quindi non consumerà alcun tempo di CPU. E oltre a ciò, la mia applicazione utilizza molti AsyncTasks, che so utilizzare un pool di thread. Da quanto ho capito, AsyncTask utilizza ThreadPoolExecutor, che non aderisce ai callback del ciclo di vita delle applicazioni (i thread nel pool quando non sono in uso, è sufficiente aspettare).

Quindi la mia domanda è: posso usare uno HandlerThread tra più componenti dell'applicazione, mai (o raramente) abbandonarlo e lasciarlo in attesa quando non in uso, senza subire gravi effetti negativi?

risposta

1

La mia preferenza personale è creare un nuovo thread ogni volta che ce n'è bisogno e pulirlo quando è fatto. In questo modo non ho problemi con più componenti che cercano di usare lo stesso thread contemporaneamente e mantengo una "clean ship". Anche Android ha il bello AsyncTask che rende questo facile per te.

Detto questo, non vedo alcun motivo per cui non è possibile riutilizzare il proprio handlerthread per più componenti, purché si regoli l'accesso al thread E si pulisca correttamente quando le attività vengono distrutte. Se capisco correttamente this post, il thread potrebbe continuare a essere eseguito anche se tutte le attività sono state interrotte perché il processo potrebbe continuare a essere in esecuzione. Per risolvere questo problema, puoi impostare il thread come thread daemon. I thread daemon vengono automaticamente distrutti quando l'ultimo thread non daemon dell'applicazione è terminato.

BTW, in alternativa, si potrebbe anche voler considerare l'utilizzo di un ThreadPoolExecutor

+0

sono d'accordo con la tua opinione, perché se una cosa che si deve fare su un altro thread è fatto per un sacco di volte, sarebbe creare un sacco di discussioni , che probabilmente bloccherà l'app. –