Видимость индикатора выполнения не устанавливается до выполнения кода
У меня есть длительный процесс ввода-вывода, в котором я хотел бы установить индикатор выполнения, чтобы показать, что на самом деле процесс запущен, а приложение не просто заморожено. Процесс копирует множество музыкальных файлов и может занять более минуты в зависимости от того, сколько их доступно.
Проблема в том, что кажется, что код выполняется перед настройкой видимости индикатора выполнения.
public void makeAvailable() {
mProgressBar.setVisibility(View.VISIBLE);
File dir = new File(gMusic);
String[] songNames = dir.list();
File[] songs = dir.listFiles();
for (int i=0; i<songs.length; i++) {
File song = songs[i];
String songName = songNames[i];
String[] bits = songName.split("/");
String songStripped = bits[bits.length-1];
File output = new File(Constants.gMusicSniperDir + "music/" + songStripped);
try {
copyFile(song, output);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
mProgressBar.setVisibility(View.INVISIBLE);
}
Как видите, он просматривает каталог и копирует все файлы. Когда он запускается, единственным признаком того, что происходит, является то, что кнопка, связанная с процессом, не покидает "нажатое" состояние - она остается подсвеченной синим цветом.
1 ответ
Похоже, вы делаете всю свою работу в потоке пользовательского интерфейса. Вы должны выполнить всю тяжелую работу (перечислить содержимое каталога и скопировать файлы) в фоновом потоке, отправляя запросы в поток пользовательского интерфейса просто для обновления индикатора выполнения.
ProgressBar
документация приводит пример этого.
Обратите внимание, что это всего лишь один пример общей темы: вы не должны блокировать поток пользовательского интерфейса в течение значительного промежутка времени, иначе ваше приложение перестанет отвечать на запросы. См. "Разработка для отзывчивости" для более подробной информации.