2011-12-31 3 views
2

実際にプロセスが実行されていることを示すために進行中のバーを設定できるようにするために、フローズン。このプロセスでは多くの音楽ファイルがコピーされ、使用可能なファイルの数に応じて1分以上かかる場合があります。コードが実行される前にプログレスバーの可視性が設定されていない

問題は、プログレスバーの可視性を設定する前にコードを実行しているようです。

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のドキュメントには、この例があります。

これは一般的なテーマの1つの例に過ぎないことに注意してください。かなりの時間UIスレッドをブロックしないでください。そうしないと、アプリケーションが応答しなくなります。詳細は"Designing for Responsiveness"を参照してください。

+0

私はあなたの言っていることを見て、それは意味がありますが、それはなぜ可視性が変わらない原因になりますか? – r2DoesInc

+0

プログレスバーのペイントはUIスレッドで行う必要がありますが、ファイルのコピー中はブロックしています。 –

+0

スレッドが終了したときに検出する方法はありますか? – r2DoesInc