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