【问题标题】:ProgressDialog not showing while performing a taskProgressDialog 在执行任务时不显示
【发布时间】:2012-10-15 13:58:09
【问题描述】:

我有一个备份例程,可以将一个文件夹中的所有内容复制到一个完美运行的外部 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()中调用这个方法吗??????
  • 按下按钮调用它

标签: android progressdialog


【解决方案1】:

您在ThreadAsyncTask 中运行长时间运行的任务。然后你的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() 放在它不起作用之后?
  • ProgressDialog 对象的显示和关闭应该使用处理程序来完成,因为只有原始线程可以触摸视图。
【解决方案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 的样本数。

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多