Asynctask ProgressDialog non mostra con .get ()
-
11-12-2019 - |
Domanda
Sto usando una sottoclasse AsyncTask
per un po 'di elaborazione in background.Il problema è che quando utilizzo la classe con il metodo .get()
, il ProgressDialog
I specificato nel onPreExecute()
non mostra.
Funziona bene se utilizzo una richiamata con il metodo onPostExecute()
.
Il mio primo pensiero è stato che questo perché il .get()
attende il processo da completare ma non può bloccare nemmeno il filo dell'interfaccia utente, quindi non è il caso.
Qualcuno può spiegare perché questo comportamento è così e se c'è una soluzione alternativa per questo ??Mi piacerebbe davvero usare il metodo .get()
se posso.
Soluzione
Inizialmente ho accettato l'altra risposta ma sembra sbagliata.
Il metodo .get()
bloccherà la filettatura dell'interfaccia utente per attendere il risultato e qualsiasi finestra di dialogo visualizzata sarà anche bloccata.Questo è il comportamento previsto per questo metodo.
L'unica alternativa è quella di non utilizzare .get()
se l'attività di sfondo è per qualsiasi quantità di tempo notevole e utilizza invece i metodi di callback sull'attività di chiamata.
Altri suggerimenti
Chiamata aysnctask.get () Su UI Thread bloccherà l'esecuzione della filettatura dell'interfaccia utente e effettuare il thread UI in attesa di Aysnctask.doinbackground () per terminare.In questo modo, sei in realtà sacrificare il beneficio di Asycntask, tutti i codici ora vengono eseguiti sincrono in modo sincrono in filo UI e filettatura di sfondo (ancora due filettatura, ma l'interfaccia utente ora attendere il filo del fondo).
Tenere anche in mente che probabilmente avrai un'eccezione ANR (bloccata più di 5 secondi) chiamando GET () sul filo UI.
Se devi davvero usarlo, chiama il tuo metodo showDialog () prima di myasynctask.get ():
showDialog();
myAsyncTask.execute();
myAsyncTask.get(); // <-- UI thread blocked and wait at this point.
dismissDialog();// <-- This line will be executed after doInBackground() finish.
.
Spero che questo aiuti.