В приложении для Android я запускаю задачу в отдельном потоке. Во время работы потока он обновляет индикатор прогресса в главном окне, чтобы пользователь знал, что происходит. Проблема в том, что если пользователь запускает поток во второй раз, индикатор выполнения не будет сброшен. Он просто будет сидеть на 100%, ничего не делая.
Весь источник доступен на github . В качестве примера возьмем BackupThread
и JsonBackup (основной класс). Обратите внимание, что «RestoreThread» показывает то же поведение, но я предполагаю, что в обоих случаях проблема идентична.
Перейдем к быстрой прогулке:
Примерно в строке 300 в JsonBackup.java я открываю новый ProgressDialog. Поскольку это новый экземпляр, я предполагаю, что все инициализировано правильно. На моей текущей рабочей копии я добавил строку, устанавливающую прогресс в «0», но это ничего не изменило. В этом же блоке я создаю резервный поток и запускаю его.
Следующий интересный код - это момент, когда поток сообщает о своем прогрессе назад к основному приложению. Это происходит около строки 185 BackupThread.java .
Сообщение обрабатывается в строке 80 JsonBackup.java , которая обновит индикатор выполнения.
Пока что прохождение кода. Одна вещь, которая поразила меня при написании этого, - строка 87 в JsonBackup.java . Я думаю, что было бы лучше, если бы поток отправил другое сообщение, явно указав, что это сделано. Но я предполагаю, что это не настоящая проблема здесь. Я говорю это потому, что диалог прогресса правильно закрывает себя, когда он достигает 100%.
Итак, если все это запустить один раз, все работает как положено. Теперь предположим, что пользователь покидает приложение, но ОС решает оставить его загруженным в память. Позже пользователь возвращается и хочет создать новую резервную копию. Тогда приложение не будет работать, так как прогресс зависает на 100%. Если вы убьете приложение и оно полностью выгружено, оно снова заработает. Поэтому я предполагаю, что некоторый экземпляр объекта все еще находится в памяти и имеет нечистое состояние при повторном запуске. Но из-за жизни я не могу найти, что происходит. В качестве касательной я мог бы добавить: кроме учебников по Блокноту, это мое первое приложение для Android, и бла ди бла бла ...
Что мне здесь не хватает ...?