AsyncTask non filettatura bloccante principale?
-
12-10-2019 - |
Domanda
Sto usando seguente codice per riempire una finestra di dialogo ListPreference personalizzato. Poiché la procedura di riempimento prende un sacco di tempo voglio mostrare una finestra di avanzamento durante la procedura di riempimento.
Il mio problema è che filler.execute () non blocca onPrepareDialogBuilder e funzioni va fino alla fine prima di valori sono riempiti causando un'eccezione ... Qualche idea?
@Override
protected void onPrepareDialogBuilder(Builder builder) {
// Load data
if (this.getEntries()==null) {
FillerTask filler = new FillerTask();
filler.execute();
}
Log.d(TAG, "Filler finished");
super.onPrepareDialogBuilder(builder);
}
Ecco il codice Filltertask, in fondo lui guarda per ogni attività con un ripieno principale intento un elenco:
private class FillerTask extends AsyncTask<Void, Void, String[][]> {
private ProgressDialog dialog;
@Override
protected void onPreExecute() {
Log.d(TAG, "Dismiss dialog");
dialog = ProgressDialog.show(MyListPreference.this.getContext(), "", "Doing stuff...", true);
}
@Override
protected String[][] doInBackground(Void... params) {
return fill();
}
public String[][] fill() {
Log.d(TAG, "Fill started");
CREATE LISTS...
// Done
Log.d(TAG, "Fill done");
String[][] result = new String[][] {entryNames, entryValues};
return result;
}
@Override
protected void onPostExecute(String[][] result) {
Log.d(TAG, "Post execute");
MyListPreference.this.setEntries(result[0]);
MyListPreference.this.setEntryValues(result[1]);
dialog.dismiss();
}
}
Soluzione 2
Trovato la soluzione, il modo migliore per farlo è l'override del metodo onClick e lasciare che l'AsyncTask postExecute chiamare il "super ()", quindi fare clic non è passato fino a quando il contenuto viene caricato e durante il caricamento viene visualizzata correttamente barra di avanzamento.
Altri suggerimenti
Il mio problema è che filler.execute () non blocca onPrepareDialogBuilder e funzioni va fino alla fine prima di valori sono riempiti causando un'eccezione ... Qualche idea?
Questo è l'intero punto dietro un AsyncTask
. Il "Async" nei mezzi AsyncTask
asincrono.
Usa il tuo AsyncTask
per ottenere i dati. Poi, nel onPostExecute()
, visualizzare la finestra di dialogo.
asyntask
non blocca thread principale, appena scende un messaggio alla coda di messaggi di thread principale