Android AsyncTask onPreExecute не вызывается неопределенно

1

У меня есть AsyncTask, который должен показывать индикатор выполнения, когда он загружает некоторые вещи через Интернет. Иногда он работает как шарм, и иногда он не показывает индикатор прогресса. Вот код:

public class Upload extends AsyncTask<Void, Void, Void> {

    private ProgressDialog dialog = new ProgressDialog(Activity.this);

    protected void onPreExecute() {
        dialog = ProgressDialog.show(Activity.this, "wait...", "", true, true);
    }
    @Override
    protected Void doInBackground(Void... params) {
        //upload stuff
        return null;
    }

    protected void onPostExecute(Void result) {

        try {
            if (dialog.isShowing())
                dialog.dismiss();
            dialog = null;
        } catch (Exception e) {
            // nothing
        }
        Intent next = new Intent(getApplicationContext(), SecondActivity.class);
        startActivity(next);
        }
    }
}

DoInBackground и onPostExecute работают всегда, а иногда и вообще работают как шарм. Но иногда, когда он загружается, индикатор прогресса не отображается. Это условие гонки? Я так не думаю, но я не могу найти никаких объяснений.

  • 0
    Является ли ваша AsyncTask внутренним классом вашей Activity или отдельным классом?
  • 0
    Это внутренний класс. Реализация как [ stackoverflow.com/questions/4607228/…) приводит к нулевому указателю в onRetainNonConfigurationInstance ()
Показать ещё 2 комментария
Теги:
android-asynctask

2 ответа

1

Вы создаете объект дважды в классе. ProgressDialog.show уже возвращает созданный объект ProgressDialog, но вы создали его сначала вверху. ProgressDialog должен быть создан один раз, поэтому попробуйте удалить экземпляр в верхней части и повторите попытку, например:

private ProgressDialog dialog;

protected void onPreExecute() {
    dialog = ProgressDialog.show(Activity.this, "wait...", "", true, true);
}
  • 0
    Нет, это не решило мою проблему.
0

Возможно, это связано с тем, что параметр void вызывает эту проблему. Просто попробуйте использовать Integer в качестве параметров.:

public class Upload extends AsyncTask<Integer, Integer, Integer>

Ещё вопросы

Сообщество Overcoder
Наверх
Меню