ProgressDialog не отображается в AsyncTask - PullRequest
0 голосов
/ 24 декабря 2011
Document doc = new Obtainer(context, uri).execute().get();

Этот код в классе действия визуализирует Obtainer (который расширяет AsyncTask), который получает документ XML из URL.Это метод onPreExecute: в конструкторе установлен контекст

protected void onPreExecute() {
        super.onPreExecute();
        System.out.println("Pre execute began");
        exception = null;
        dialog = new ProgressDialog(context);
        dialog.setMessage("Loading started");
        dialog.setIndeterminate(true);
        dialog.setCancelable(false);
        System.out.println("Preexecute end");
        dialog.show();
    }

:

public Obtainer(Context c, String addr) {
    context = c;
    address = addr;
}

Во время выполнения я вижу в выходных данных консоли «Pre execute begin begin» и «Preexecute»конец "но диалог прогресса не отображается.В чем проблема?

Ответы [ 2 ]

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

Какой контекст вы передаете, когда создаете свой Obtainer (подкласс AsyncTask)?

Если вы используете контекст приложения через getApplicationContext (), его нельзя использовать для создания диалога (или любого представления дляэто важно).Вам нужно передать ему контекст, который может создавать представления.

"Если у вас есть привычка использовать контекст приложения (например, из вызова getApplicationContext ()) в местах, где вам нужен контекстдля создания представлений это лишь вопрос времени, пока вы не найдете случай, когда все будет работать не так, как вы хотели бы или ожидаете. "

От: https://plus.google.com/107708120842840792570/posts/VTeRBsAeyTi

0 голосов
/ 24 декабря 2011

Используйте этот код, он работает для меня:

class Obtainer extends AsyncTask<Void, Void, Void> {
    private ProgressDialog dialog;

    @Override
    protected void onPreExecute() {
        dialog = new ProgressDialog(App.this); // App - your main activity class
        dialog.setMessage("Please, wait...");
        dialog.show();
    }

    @Override
    protected Void doInBackground(Void... params) {
                // ... 
    }

    @Override
    protected void onPostExecute(Void result) {
        dialog.dismiss();
    }

}

А в вашем основном классе деятельности вызов метода

new Obtainer().execute();
...