Обновите ProgressDialog с ProgressBar после вращения - PullRequest
1 голос
/ 29 апреля 2019

Мое приложение обрабатывает некоторые изображения в потоке, и в то же время оно показывает диалог с индикатором выполнения.

progressDialog = new ProgressDialog(Activity.this);
progressDialog.setProgressStyle(size);
progressDialog.show();
Thread thread = new Thread(new Runnable() {
    @Override
    public void run() {
        for(int i = 0; i < size; i++{
            //process images
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    progressDialog.setProgress(i);
                }
            });
        }

    }
});
thread.start();

Теперь, если происходит вращение, я делаю

@Override
protected void onDestroy() {
    if (progressDialog != null && progressDialog.isShowing()) {
        progressDialog.dismiss();
    }

    super.onDestroy();
}

и в onCreate я воссоздаю диалог. Но поток не меняет индикатор выполнения этого нового диалога.

1 Ответ

1 голос
/ 29 апреля 2019

После поворота действие (или фрагмент), в котором отображается это диалоговое окно, отбрасывается и создается новое.

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

Я бы посоветовал вам сделать следующее:

  1. Реализуйте некоторый класс ImageProcessor и поместите его экземпляр в объект Application.
  2. Сделайте класс ImageProcessor видимым и уведомите слушателей о прогрессе.
  3. Получить ссылку на этот объект в Activity и подписаться на уведомления в onStart () (и отписаться в onStop ()).
  4. Когда приходят уведомления об обновлении статуса - обновлять индикацию хода выполнения

Используя этот подход, вы будете иметь логику обработки, инкапсулированную в специальный объект, который выдерживает ротацию, и различные компоненты могут вызывать его методы и подписываться на уведомления от него.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...