关于java:在执行代码之前未设置进度条可见性

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 线程只是为了更新进度条。

ProgressBar 文档给出了一个例子。

请注意,这只是一个常见主题的示例:您不应长时间阻塞 UI 线程,否则您的应用程序将变得无响应。有关详细信息,请参阅"响应性设计"。