Android AsyncTask - onPostExecute не вызывается (ProgressDialog) - PullRequest
0 голосов
/ 07 сентября 2011

У меня есть следующий код:

try {
    res = new Utils(ubc_context).new DownloadCalendarTask().execute().get();
} catch (InterruptedException e) {
    Log.v("downloadcalendar", "interruptedexecution : " + e.getLocalizedMessage());
    res = false;
} catch (ExecutionException e) {
    Log.v("downloadcalendar", "executionexception : " + e.getLocalizedMessage());
    res = false;
}

Log.v("displaymenu", "A");

public class Utils {

private Context context;

public Utils(Context context) {
    this.context = context;
}

public class DownloadCalendarTask extends AsyncTask<Void, Void, Boolean> {

    private ProgressDialog dialog;

    public DownloadCalendarTask() {

    dialog = new ProgressDialog(context);

    }

    protected void onPreExecute() {
        Log.v("preexecute", "A");
        dialog.setMessage("Loading calendar, please wait...");
        Log.v("preexecute", "B");
        dialog.show();
        Log.v("preexecute", "C");

    }

    protected Boolean doInBackground(Void... arg0) {
        // do some work here...
        return (Boolean) false;
    }

    protected void onPostExecute() {
        Log.d("utils", "entered onpostexecute");
        dialog.dismiss();
    }

}
}

Первая часть кода прикреплена к слушателю onClick для кнопки.Когда я нажимаю кнопку, кнопка мигает (как показывает, что она была нажата), а затем, примерно через 8 секунд, появляется диалоговое окно загрузки, но оно никогда не заканчивается.

Согласно logcat, как только я нажимаю кнопку, onPreExecute выполняется, как Dialog.show(), поэтому моя первая проблема - почему эта 8-секундная задержка?В течение этих 8 секунд logcat показывает, что выполняется doInBackground.Однако, согласно logcat (это вторая проблема), onPostExecute никогда не вызывается (и поэтому Dialog.dismiss ()) никогда не запускается.

Logcat показывает, что все, что следует за DownloadCalendarTask().execute().get(), выполняется, так как будто onPostExecute только что пропущен.

Большое спасибо за вашу помощь!

1 Ответ

1 голос
/ 07 сентября 2011

Вы вызываете AsyncTask.get (), который приводит к блокировке потока пользовательского интерфейса во время выполнения AsyncTask.

new DownloadCalendarTask().execute().get();

Если вы удалите вызов get (), он будет выполняться асинхронно и даст ожидаемый результат.

new DownloadCalendarTask().execute();

Edit: Вам также необходимо обновить параметры вашего метода onPostExecute, они должны включать результат. например,

protected void onPostExecute(Boolean result) {
...