Android 执行任务时未显示ProgressDialog

Android 执行任务时未显示ProgressDialog,android,progressdialog,Android,Progressdialog,我有一个备份例程,它可以将所有内容从一个文件夹复制到一个外部SD卡上,这非常有效。我试图得到一个很好的弹出对话框,当它运行时显示,但它只是不显示。甚至不尝试运行(但备份已完成) 这是我目前的代码: public void doBackup(View view) throws IOException{ ProgressDialog pd = new ProgressDialog(this); pd.setProgressStyle(ProgressDialog.STYLE_SPIN

我有一个备份例程,它可以将所有内容从一个文件夹复制到一个外部SD卡上,这非常有效。我试图得到一个很好的弹出对话框,当它运行时显示,但它只是不显示。甚至不尝试运行(但备份已完成)

这是我目前的代码:

public void doBackup(View view) throws IOException{
    ProgressDialog pd = new ProgressDialog(this);
    pd.setProgressStyle(ProgressDialog.STYLE_SPINNER);
    pd.setMessage("Running backup. Do not unplug drive");
    pd.setIndeterminate(true);
    pd.setCancelable(false);
    pd.show();
    File source = new File("/mnt/extSdCard/DirectEnquiries"); 
    File dest = new File("/mnt/UsbDriveA/Backup");
    copyDirectory(source, dest);
    pd.dismiss();
}

创建一个asyntask并将耗时的任务

 public void doBackup(View view) throws IOException{
        ProgressDialog pd = new ProgressDialog(this);
       pd.setProgressStyle(ProgressDialog.STYLE_SPINNER);
        pd.setMessage("Running backup. Do not unplug drive");
       pd.setIndeterminate(true);
       pd.setCancelable(false);
        pd.show();
//create asyntask here
//Put below code in doInBackground mathod
        File source = new File("/mnt/extSdCard/DirectEnquiries"); 
        File dest = new File("/mnt/UsbDriveA/Backup");
        copyDirectory(source, dest);
//put this code in onPostExecute Method.
        pd.dismiss();
    }

您将获得Asyntask的样本数。

而不是一次在一个函数中执行此操作。执行以下步骤,它肯定会对您有效。 1.创建一个异步类。(它将为您的复制目录功能创建一个单独的线程,并且不会在主UI上运行。) 2.在执行异步类之前显示进度对话框。
3.在执行后方法中,关闭对话框。

您可以在
线程中运行长时间运行的任务,或者使用
异步任务运行长时间运行的任务。然后将显示您的
ProgressDialog

做一些类似于:

public void doBackup(View view) throws IOException{
    final ProgressDialog pd = new ProgressDialog(this);
    pd.setProgressStyle(ProgressDialog.STYLE_SPINNER);
    pd.setMessage("Running backup. Do not unplug drive");
    pd.setIndeterminate(true);
    pd.setCancelable(false);
    pd.show();
    Thread mThread = new Thread() {
        @Override
        public void run() {
            File source = new File("/mnt/extSdCard/DirectEnquiries"); 
            File dest = new File("/mnt/UsbDriveA/Backup");
            copyDirectory(source, dest);
            pd.dismiss();
        }
    };
    mThread.start();
}

你是在onCreate()中调用这个方法吗?????它是在一个按钮上被调用的。你能解释一下为什么我们应该放置pd.discouse();在线程内部,我使用了mThread.join(),并在其放置后放置了pd.dismise()。ProgressDialog对象的显示和解除应该使用处理程序来完成,因为只有原始线程才能接触视图。