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

时间:2011-12-31 08:38:21

标签: java android progress-bar

我有一个长期运行的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);
}

如您所见,它循环遍历目录并复制所有文件。当它运行时,发生任何事情的唯一指示是与进程关联的按钮不会处于“按下”状态 - 它会保持突出显示为蓝色。

1 个答案:

答案 0 :(得分:4)

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

ProgressBar文档举例说明了这一点。

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