ProgressBar не сбрасывается в «0» при открытии во второй раз - PullRequest
5 голосов
/ 17 мая 2010

В приложении для Android я запускаю задачу в отдельном потоке. Во время работы потока он обновляет индикатор прогресса в главном окне, чтобы пользователь знал, что происходит. Проблема в том, что если пользователь запускает поток во второй раз, индикатор выполнения не будет сброшен. Он просто будет сидеть на 100%, ничего не делая.

Весь источник доступен на github . В качестве примера возьмем BackupThread и JsonBackup (основной класс). Обратите внимание, что «RestoreThread» показывает то же поведение, но я предполагаю, что в обоих случаях проблема идентична.

Перейдем к быстрой прогулке:

Примерно в строке 300 в JsonBackup.java я открываю новый ProgressDialog. Поскольку это новый экземпляр, я предполагаю, что все инициализировано правильно. На моей текущей рабочей копии я добавил строку, устанавливающую прогресс в «0», но это ничего не изменило. В этом же блоке я создаю резервный поток и запускаю его.

Следующий интересный код - это момент, когда поток сообщает о своем прогрессе назад к основному приложению. Это происходит около строки 185 BackupThread.java .

Сообщение обрабатывается в строке 80 JsonBackup.java , которая обновит индикатор выполнения.

Пока что прохождение кода. Одна вещь, которая поразила меня при написании этого, - строка 87 в JsonBackup.java . Я думаю, что было бы лучше, если бы поток отправил другое сообщение, явно указав, что это сделано. Но я предполагаю, что это не настоящая проблема здесь. Я говорю это потому, что диалог прогресса правильно закрывает себя, когда он достигает 100%.

Итак, если все это запустить один раз, все работает как положено. Теперь предположим, что пользователь покидает приложение, но ОС решает оставить его загруженным в память. Позже пользователь возвращается и хочет создать новую резервную копию. Тогда приложение не будет работать, так как прогресс зависает на 100%. Если вы убьете приложение и оно полностью выгружено, оно снова заработает. Поэтому я предполагаю, что некоторый экземпляр объекта все еще находится в памяти и имеет нечистое состояние при повторном запуске. Но из-за жизни я не могу найти, что происходит. В качестве касательной я мог бы добавить: кроме учебников по Блокноту, это мое первое приложение для Android, и бла ди бла бла ...

Что мне здесь не хватает ...?

Ответы [ 2 ]

4 голосов
/ 17 мая 2010

Dialog кэшируется Activity, это ожидаемое поведение.
Варианты:

  1. переопределить onPrepareDialog(..) для сброса его состояния
  2. позвоните removeDialog(..), прежде чем снова показать его
  3. управляйте диалогом самостоятельно, вручную вызывая show(), dismiss()

Я обычно хожу № 1 для часто используемых Dialog с и № 3 для редких.

1 голос
/ 18 мая 2010

Я обычно использую onCreateDialog () плюс onPrepareDialog () для управления диалогами.

Из руководства разработчика по Android-разработчикам:

Лучший способ определить методы обратного вызова onCreateDialog (int) и onPrepareDialog (int, Dialog) - это оператор switch, который проверяет параметр id, передаваемый в метод. Каждый случай должен проверять уникальный идентификатор диалога, а затем создавать и определять соответствующий диалог.

Метод onCreateDialog () вызывается один раз при первом создании диалогового окна; помещает сюда код, который инициализирует ваши диалоги.

Метод onPrepareDialog () вызывается каждый раз, когда отображается диалоговое окно.

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

Когда диалог должен быть закрыт, вы можете:

Если вы используете onCreateDialog (int) управлять состоянием ваших диалогов (как обсуждалось в предыдущем раздел), то каждый раз ваш диалог уволен, состояние Диалога объект сохраняется в Activity. Если вы решаете, что больше не будете нужен этот объект или это важно что состояние очищается, то вы должен вызвать removeDialog (int). это удалит все внутренние ссылки на объект, и если диалог показывая, это отклонит это.

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