2012-05-23 17 views
10

In Android, Handler può essere usato per postare/gestire il messaggio, se non uso un HandlerThread (passa il Looper al Gestore), significa che in questo caso Handler usa MainThread (UI Thread) Looper?Perché usare HandlerThread in Android

Quale risultato otterrà se Handler utilizza il Looper di MainThread? Può causare mainThread bloccato?

risposta

4

Come Doc dice:

classe Handy per l'avvio di un nuovo thread che ha un looper.
Il looper può quindi essere utilizzato per creare classi di gestori.
Nota che start() deve ancora essere chiamato.

HanderThread classe eredita dalla classe Thread, che incapsula l'oggetto Looper, in modo che non ci interessa il Looper aperta e rilasciare i dettagli. Come nel caso di thread normali, è necessario utilizzare Looper.prepare() e Looper.loop() per convertirlo come LooperThread.

4

modo normale usare HandlerThread in questo modo:

HandlerThread thread = new HandlerThread("A Handler Thread"); 
thread.start(); 
Handler handler = new Handler(thread.getLooper()){ 
    @Override 
    public void handleMessage(Message msg) 
    { 
    //.... 
    } 
}; 

Perché HandlerThread può creare un Looper per Handler, è una sorta di modo conveniente.

Quando si crea un nuovo gestore, che è legato alla coda di discussione/messaggio del filo che si sta creando - vedi documentazione ufficiale ...

+0

Questa è la documentazione ufficiale. 'Comoda classe per iniziare un nuovo thread che ha un looper. Il looper può quindi essere utilizzato per creare classi di gestori. Nota che start() deve ancora essere chiamato. 'Ho salvato il tuo tempo. – UnKnown

10

Si potrebbe utilizzare HandlerThread nel caso in cui si desidera eseguire attività di background una alla volta e si desidera che tali attività vengano eseguite nell'ordine di esecuzione.

Ad esempio se si desidera eseguire più operazioni sullo sfondo della rete una per una.

Sì, il Gestore ha il proprio looper e i gestori possono essere creati e pubblicati (quindi non bloccherebbe il thread principale).

0

HandlerThread è utile quando si desidera eseguire molte attività in background, poiché ha il suo looper. Normalmente, se si invia un messaggio a un gestore, viene utilizzato il looper del MainThread. Ciò significa che l'attività viene eseguita sul thread dell'interfaccia utente. Ma nel caso di HandlerThread, queste attività vengono eseguite sul thread di lavoro. È possibile trovare una spiegazione più dettagliata here

2

se io non uso una HandlerThread (passare il suo Looper a Handler), vuol dire che in questo caso Handler utilizzare MainThread (UI Thread) 's Looper?

Dai un'occhiata alla documentazione dei Handler

Handler() 

predefinite costruttore associa questo gestore con il Looper per il thread corrente.

Se il thread corrente è MainThread, utilizza il looper MainThread (Thread UI).

Per associare in modo esplicito Handler al MainThread (Thread UI), scrivere sotto il codice.

Handler mHandler = new Handler(Looper.getMainLooper(); 

Se si scrive è come sotto, utilizza HandlerThread Looper.

HandlerThread handlerThread = new HandlerThread("HandlerThread"); 
handlerThread.start(); 
Handler requestHandler = new Handler(handlerThread.getLooper()); 

Se avete qualsiasi operazione di IO di rete in Runnable compito, non è possibile utilizzare principale crochet thread. In tal caso, HandlerThread è utile per inviare l'attività Runnable eseguendo operazioni IO di rete.

Potete trovare esempio di codice @How do I fix android.os.NetworkOnMainThreadException?

Quale girone ottenere se Handler utilizza Looper di MainThread? Può causare mainThread bloccato?

Se si inviano molti eventi su MainThread Looper, verranno eseguiti su MainThread (UI Thread) stesso. Se le attività inviate richiedono più tempo per l'esecuzione, MainThread verrà bloccato.

Controlla qui sotto postale per interni di Looper:

What is the purpose of Looper and how to use it?