2012-10-15 15 views
9

Her şey bir klasörden mükemmel bir şekilde çalışan bir harici SD karta kopyalayan bir yedekleme rutinim var. Çalıştığını gösteren güzel bir açılır iletişim kutusu almaya çalışıyorum ama sadece göstermiyor. Çalışmaya bile çalışmaz (ancak yedekleme tamamlanır).ProgressDialog bir görevi gerçekleştirirken gösterilmiyor

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

Eğer onCreate bu yöntemi() aradığınız ????? –

+0

Bu bir düğmeye basarak çağrılıyor – TMB87

cevap

30

Thread'da veya AsyncTask ile uzun süren görevleri çalıştırıyorsunuz. Sonra senin ProgressDialog görünecektir.

yapın gibi bir şey:

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

Bu bir çekicilik çalıştı, çok teşekkür ederim – TMB87

+0

neden pd.dismiss(); iş parçacığı içinde mThread.join() kullandım ve pd.dismiss() koyduktan sonra işe yaramıyor mu? –

+0

ProgressDialog nesnesinin gösterilmesi ve işten çıkarılması, yalnızca orijinal iş parçacığı görünüme dokunabileceğinden bir işleyici ile yapılmalıdır. –

1

senin zaman alıcı görevler

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

Sen Asyntask ait örneklerin sayısını alacak bir asyntask oluşturun ve koyun:

İşte şu anda benim kod. Tek bir işlevde aynı anda yapmak yerine

0

. Aşağıdaki adımları yapın ve kesinlikle sizin için çalışacaktır. 1. Bir eşzamansız sınıf oluşturun. (Kopyalama dizini işlevleriniz için ayrı bir iş parçacığı oluşturacak ve ana kullanıcı arabiriminde çalışmaz.) 2. Senkronizasyon sınıfını çalıştırmadan önce ilerleme iletişiminizi gösterin. 3. Yürütme sonrası yönteminde, iletişim pencerenizi kapatın.

İlgili konular