2016-03-03 8 views
12

In un'applicazione Android che utilizza Firebase, ho bisogno di eseguire lunghe operazioni in background quando Firebase restituisce una risposta alla query. Es .:Firebase Android: evento onDataChange() sempre eseguito nel thread dell'interfaccia utente principale?

query.addListenerForSingleValueEvent(new ValueEventListener() { 
    @Override 
    public void onDataChange(DataSnapshot data) { 
     dosomething very long. . . 
     then call a callback forUI thread 
    } 

So che Firebase eseguire la query in modo asincrono, ma il metodo onDataChange() sembra essere sempre eseguita nel thread principale dell'interfaccia utente, anche se provo a chiamare la query in uno sfondo personalizzato thread.

Qualcuno sa come gestire questo caso d'uso?

risposta

16

I callback per i listener Firebase sono effettivamente eseguiti sul thread principale dell'interfaccia utente.

Se è necessario eseguire operazioni pesanti in una richiamata, avviare un AsyncTask e svolgere i lavori lì. Il metodo AsyncTask.doInBackground() viene eseguito su un thread diverso, quindi non bloccherà l'interfaccia utente di Android. Ma AsyncTask. onPostExecute() viene eseguito nuovamente sul thread principale, quindi puoi aggiornare le tue visualizzazioni dell'interfaccia da lì.

+0

ok ora è più chiaro. Lanciamo un'attività asincrona direttamente nel metodo onDataChange() e questa attività eseguirà il listener dell'interfaccia di callback alla fine. – toofoo

+8

C'è un modo per impostare il thread in cui si desidera ripristinare l'azione di callback? –

+1

Frank, hai in mente questa idea? essere in grado di selezionare il thread che si desidera restituire il callback Firebase? –