2011-12-31 2 views
2

У меня есть длительный процесс io, который я хотел бы установить во время выполнения, чтобы показать, что на самом деле процесс выполняется, и приложение не просто замораживали. Процесс копирует много музыкальных файлов и может занимать больше минуты в зависимости от того, сколько из них доступно.Видимость индикатора выполнения не устанавливается перед выполнением кода

Проблема заключается в том, что она выполняет код перед установкой видимости индикатора выполнения.

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); 
} 

Как вы видите, это циклически проходит через каталог и копирует все файлы. Когда он запускается, единственным признаком всего, что происходит, является то, что кнопка, привязанная к процессу, не оставляет «нажатого» состояния - она ​​остается выделенной синей.

ответ

4

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

Приводится пример документации ProgressBar.

Обратите внимание, что это всего лишь один пример общей темы: вы не должны блокировать поток пользовательского интерфейса в течение какого-либо значительного периода времени, или ваше приложение перестает отвечать на запросы. См. "Designing for Responsiveness" для более подробной информации.

+0

Я вижу, что вы говорите, и это имеет смысл, хотя почему это может привести к тому, что видимость не изменится? – r2DoesInc

+0

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

+0

Есть ли способ обнаружить, когда нить заканчивается? – r2DoesInc

Смежные вопросы