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();
    }
 }  
È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top