ProgressDialog в AsyncTask не обновляется или не удаляется - PullRequest
0 голосов
/ 16 августа 2011

Я использую AsyncTask для обработки сложных фоновых операций (компиляция файла журнала для отправки), и я использую ProgressDialog, чтобы показать прогресс пользователя. Я пытался использовать showDialog (), но он никогда не показывал и не отклонял (он никогда не вызывался), и я следовал инструкциям о том, как это сделать ... Поэтому я использую неуправляемые, и это не отклонит мое сообщение. Я также хочу обновить сообщение, так как оно начинает компилировать файл журнала (так как оно кажется там запаздывающим - или, возможно, текстовое представление просто очень длинное, поэтому оно не обновляется, как положено).

Я немного переместил свой код, чтобы он выглядел так, как будто есть проблемы (например, onProgressUpdate ()), но я не знаю, как заставить его работать. Я осмотрел этот сайт, и, похоже, у меня нет проблемы (не совсем так). RunOnUiThread () не работает, новый Thread () {} не работает, и onProgressUpdate () я не могу приступить к работе (документация по этому вопросу сбивает с толку).

Это также никогда не отклоняет. Я настроил слушателя, и он никогда не закрывает глаза.

Кто-нибудь знает, что не так с моим кодом? Я думал, что AsyncTask должен был быть простым.

        private class BuildLogTask extends AsyncTask<Void, Void, String> {
        String temp;
        ProgressDialog progressdialog = new ProgressDialog(context); //variable is defined at onCreate (held as private, not static)

        @Override
        protected String doInBackground(Void... params) {
            temp = buildLog();
            logdata = temp;
            publishProgress();
            createLogFile();
            return temp;
        }

        protected void onProgressUpdate() {
            progressdialog.setMessage("Compiling Log File...");
        }

        @Override
        protected void onPreExecute() {
            Log.w(TAG,"Showing Dialog");
            send.setEnabled(false);
            ProgressDialog progressdialog = new ProgressDialog(context);
            progressdialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
            progressdialog.setMessage("Gathering Data...");
            progressdialog.setCancelable(false);
            progressdialog.setOnDismissListener(new DialogInterface.OnDismissListener() {

                @Override
                public void onDismiss(DialogInterface dialog) {
                    Log.e(TAG,"Progress Dialog dismissal.");

                }
            });
            progressdialog.show();
        }

        @Override
        protected void onCancelled(){
            Log.e(TAG,"Progress Dialog was Cancelled");
            progressdialog.dismiss();
            logdata=null;
        }

        @Override
        protected void onPostExecute(String result) {
            progressdialog.dismiss();
            send.setEnabled(true);
            previewAndSend();
        }

    }

Ответы [ 3 ]

2 голосов
/ 16 августа 2011

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

0 голосов
/ 02 января 2016

Попробуй,

Заменить:

progressdialog.show();

Для:

progressdialog = progressdialog.show();

Удачи.

0 голосов
/ 16 августа 2011

Есть две проблемы.

  1. Неверная подпись для onProgressUpdate.Попробуйте вместо этого:

    @ Переопределить защищенный void onProgressUpdate (Void ... progress) {progressdialog.setMessage ("Компиляция файла журнала ...");}

  2. Вы маскируете переменную члена progressDialog с локальной переменной в onPreExecute ()

РЕДАКТИРОВАТЬ: Обнаружена вторая проблема:

...