Progress bar visibility not being set before code is executed
我有一个长时间运行的 io 进程,我希望能够在此期间设置一个进度条,以显示实际上有一个进程正在运行并且应用程序不只是冻结。该过程会复制许多音乐文件,并且可能需要一分钟以上的时间,具体取决于可用的数量。
问题是,它似乎在设置进度条可见性之前执行了代码。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | 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); } |
如您所见,它循环遍历目录并复制所有文件。当它运行时,发生任何事情的唯一迹象是与进程相关联的按钮不会离开"按下"状态 - 它保持突出显示的蓝色。
看起来您正在 UI 线程中完成所有工作。您应该在后台线程中完成所有繁重的工作(列出目录的内容和复制文件),将请求发布到 UI 线程只是为了更新进度条。
请注意,这只是一个常见主题的示例:您不应长时间阻塞 UI 线程,否则您的应用程序将变得无响应。有关详细信息,请参阅"响应性设计"。