AsyncTask не блокирует основной поток? - PullRequest
2 голосов
/ 21 декабря 2010

Я использую следующий код для заполнения настраиваемого диалога ListPreference. Поскольку процедура заполнения занимает много времени, я хочу показать диалог прогресса во время процедуры заполнения.

Моя проблема в том, что filler.execute () не блокирует onPrepareDialogBuilder и функции работают до конца, прежде чем значения будут заполнены, вызывая исключение ... Есть идеи?

@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);
}

Вот код Filltertask, в основном он ищет каждое действие с ОСНОВНЫМ Намерением, заполняя список:

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();
    }
 }  

Ответы [ 3 ]

2 голосов
/ 21 декабря 2010

Моя проблема в том, что filler.execute () не блокирует onPrepareDialogBuilder и функции работают до конца, прежде чем значения будут заполнены, вызывая исключение ... Есть идеи?

В этом весь смысл AsyncTask. «Асинхронный» в AsyncTask означает асинхронный.

Используйте ваши AsyncTask для получения ваших данных. Затем в onPostExecute() откройте диалоговое окно.

0 голосов
/ 21 марта 2012

asyntask не блокирует основной поток, он просто отбрасывает сообщение в очередь сообщений основного потока

0 голосов
/ 23 декабря 2010

Нашел решение, лучший способ сделать это - переопределить метод onClick и позволить AsyncTask postExecute вызвать "super ()", поэтому щелчок не передается до тех пор, пока содержимое не будет загружено и во время загрузки индикатор выполнения будет отображаться правильно.

...