2011-12-31 57 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

看起来你正在UI线程中完成所有工作。您应该在后台线程中完成所有繁重工作(列出目录的内容和复制文件),并将请求发布到UI线程以更新进度栏。

ProgressBar文档给出了一个例子。

请注意,这只是一个常见主题的一个示例:您不应该在任何相当长的时间内阻塞UI线程,否则您的应用程序将无响应。有关更多详细信息,请参阅"Designing for Responsiveness"

+0

我明白你的意思了,这很合理,但为什么会导致能见度不能改变? – r2DoesInc 2011-12-31 08:43:37

+0

进度条的绘制必须在UI线程中完成,但是您在复制文件时会阻止它。 – 2011-12-31 08:45:19

+0

有没有办法检测线程何时完成? – r2DoesInc 2011-12-31 09:01:57