2012-10-15 52 views
9

我有一个备份例程,可将所有内容从一个文件夹复制到完美工作的外部SD卡。我试图得到一个漂亮的弹出对话框,显示它运行的时间,但它没有显示。甚至不尝试运行(但备份完成)。执行任务时未显示ProgressDialog

这里是我的时刻代码:

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(); 
} 
+0

你调用的onCreate()这个方法????? –

+0

这是一个按钮上按 – TMB87

回答

30

您在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(); 
} 
+0

这工作的魅力,非常感谢你 – TMB87

+0

你能解释为什么我们应该把pd.dismiss();在我使用mThread.join()的线程里面,我把pd.dismiss()放到它后面不起作用? –

+0

显示和解除ProgressDialog对象应该使用处理程序完成,因为只有原始线程才能触摸该视图。 –

1

创建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的样本数。

0

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