执行任务时ProgressDialog未显示

11

我有一个备份程序,可以将一个文件夹中的所有内容复制到外部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();
}

你是在onCreate()方法中调用这个函数吗? - maninder singh
它会在按钮按下时被调用。 - MissCoder87
3个回答

41

你可以在一个Thread中或使用AsyncTask来执行长时间运行的任务。然后你的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();
}

你能解释一下为什么我们应该把pd.dismiss()放在线程里面吗?我使用了mThread.join(),并且把pd.dismiss()放在它后面,但是它不起作用。 - Mohammed Subhi Sheikh Quroush
ProgressDialog对象的显示和取消应该使用处理程序来完成,因为只有原始线程才能触摸视图。 - ılǝ

2
创建一个异步任务并将耗时的任务放入其中。
 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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接