2012-10-15 41 views
9

Tôi có một thường trình sao lưu sao chép mọi thứ từ một thư mục sang thẻ SD bên ngoài hoạt động hoàn hảo. Tôi đang cố gắng để có được một hộp thoại popup đẹp cho thấy khi nó đang chạy nhưng nó chỉ không hiển thị. Thậm chí không cố gắng chạy (nhưng sao lưu không hoàn thành).ProgressDialog không hiển thị khi đang thực hiện tác vụ

Dưới đây là mã của tôi vào lúc này:

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

được bạn gọi phương pháp này trong onCreate() ????? –

+0

Nó đang được gọi trên một nút bấm – TMB87

Trả lời

30

Bạn chạy các tác vụ chạy dài trong một số Thread hoặc với AsyncTask. Sau đó, ProgressDialog của bạn sẽ hiển thị.

làm cái gì đó như:

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

Điều này làm việc một say mê, cảm ơn bạn rất nhiều – TMB87

+0

bạn có thể giải thích lý do tại sao chúng ta nên đặt pd.dismiss(); bên trong thread tôi đã sử dụng mThread.join() và tôi đặt pd.dismiss() sau khi nó đặt nó không hoạt động? –

+0

Việc hiển thị và loại bỏ đối tượng ProgressDialog nên được thực hiện bằng trình xử lý, vì chỉ chuỗi ban đầu mới có thể chạm vào chế độ xem. –

1

Tạo một asyntask và đặt tốn thời gian công việc của bạn

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

Bạn sẽ nhận được số lượng mẫu của Asyntask.

0

Thay vì thực hiện việc này trong cùng một chức năng. Thực hiện các bước sau và chắc chắn sẽ làm việc cho bạn. 1. Tạo một lớp không đồng bộ (Nó sẽ tạo một chuỗi riêng biệt cho chức năng thư mục sao chép của bạn và sẽ không chạy trên giao diện người dùng chính.) 2. Hiển thị hộp thoại tiến trình của bạn trước khi bạn thực thi lớp async. 3. Trên phương thức thực thi bài, hãy bỏ qua hộp thoại của bạn.

Các vấn đề liên quan