2013-05-17 8 views
11

Ho appena iniziato a guardare GreenRobot's EventBus per Android e ho una domanda sul threading.Threading degli eventi utilizzando GreenRobot EventBus

Ho una procedura di lunga durata che vorrei eseguire su un thread in background che, una volta completato, aggiorna l'interfaccia utente.

Quindi qualcosa di simile:

public void onEventBackgroundThread(MyEvent event) { 
     doSomeLongRunningProcess(); 
     updateUI(); 
    } 

Ovviamente updateUI() non può essere chiamato qui perché sarebbe anche essere eseguito in background.

Quindi quale sarebbe il modo consigliato di gestirlo? Attivare un altro evento dall'interno del mio onEventBackgroundThread() che verrà eseguito sul thread dell'interfaccia utente? O licenziarlo dal processo a lungo termine stesso? O c'è un modello migliore?

risposta

21

Probabilmente sparo un altro evento quando ottieni il risultato.

public void onEventBackgroundThread(MyEvent event) { 
    doSomeLongRunningProcess(); 
    EventBus.getDefault().post(new MyEventResult()); 
} 

Attenzione però: reading the docs, si trova questo:

BackgroundThread: abbonato sarà chiamato in un thread in background. Se il thread di pubblicazione non è il thread principale, i metodi del gestore di eventi saranno chiamati direttamente nel thread di registrazione. Se il thread di registrazione è il thread principale , EventBus utilizza un singolo thread in background che eseguirà in modo sequenziale tutti gli eventi in sequenza. I gestori di eventi che utilizzano questa modalità dovrebbero provare a tornare rapidamente per evitare di bloccare il thread in background.

Se si impiega molto tempo in questo metodo, altri callback EventBus verranno ritardati e probabilmente si tradurranno in un'applicazione non rispondente.

probabilmente si desidera utilizzare onEventAsync:

Async: metodi di gestore di eventi vengono chiamati in un thread separato. Questo è sempre indipendente dal thread di pubblicazione e dal thread principale. Gli eventi di registrazione non attendono mai i metodi del gestore di eventi che utilizzano questa modalità. I metodi del gestore eventi dovrebbero utilizzare questa modalità se la loro esecuzione potrebbe richiedere , ad es. per l'accesso alla rete. Evitare di attivare un numero di numeroso di metodi di gestione asincrona a esecuzione prolungata allo stesso tempo per limitare il numero di thread simultanei. EventBus utilizza un pool di thread per riutilizzare in modo efficiente i thread dalle notifiche di gestore eventi asincrono completate .

+0

Grazie, Pedro. E apprezza la tua raccomandazione su onEventAsync. – jFort

3

Suggerirei di attivare un altro evento che verrà gestito dal metodo onEventMainThread.

Questo ha un impatto positivo sul fatto che il updateUI non viene chiamato affatto se il destinatario è già non registrato (ad esempio attività non registrata perché è stata distrutta).

Problemi correlati