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

Java 执行代码前未设置进度条可见性,java,android,progress-bar,Java,Android,Progress Bar,我有一个长时间运行的io进程,我希望能够在运行期间设置一个进度条,以显示实际上有一个进程正在运行,并且应用程序不仅仅是冻结的。这个过程复制了许多音乐文件,可能需要一分钟以上的时间,具体取决于有多少可用的音乐文件 问题是,它似乎在设置进度条可见性之前执行代码 public void makeAvailable() { mProgressBar.setVisibility(View.VISIBLE); File dir = new File(gMusic);

我有一个长时间运行的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);
}
public void makeAvailable(){
mProgressBar.setVisibility(View.VISIBLE);
文件目录=新文件(gMusic);
String[]songNames=dir.list();
File[]songs=dir.listFiles();

对于(int i=0;i来说,您似乎正在UI线程中完成所有工作。您应该在后台线程中完成所有繁重的工作(列出目录内容,并复制文件),将请求发布到UI线程,只是为了更新进度条

文档中给出了一个例子


请注意,这只是一个常见主题的示例:您不应该在很长的时间内阻止UI线程,否则您的应用程序将变得无响应。有关更多详细信息,请参阅。

我明白您的说法,这是有道理的,但为什么这会导致可见性不改变?进度条的绘制必须在UI线程,但您在复制文件时阻止了它。线程完成后,使用处理程序隐藏pbar。感谢您的帮助!:D