2012-10-15 1 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

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

이 호출되어 부름을 받았습니다. 감사합니다. – TMB87

+0

왜 우리는 pd.dismiss()를 사용해야하는지 설명 할 수 있습니까? 스레드 내에서 mThread.join()을 사용하고 pd.dismiss()를 넣은 후에 작동하지 않습니다. –

+0

원래 스레드 만보기에 닿을 수 있기 때문에 ProgressDialog 개체의 표시 및 해제는 처리기를 사용하여 수행해야합니다. –

1

당신의 시간이 소요되는 작업

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의 샘플 수를 얻을 것이다 asyntask를 만들고 넣어 :

는 다음 순간에 내 코드입니다.

0

한 번에 하나의 기능으로이를 수행하는 대신. 다음 단계를 수행하면 확실히 작동 할 것입니다. 1. 하나의 비동기 클래스를 만듭니다 (복사 디렉토리 기능을 위해 하나의 별도 스레드를 만들고 기본 UI에서 실행하지 않습니다). 2. async 클래스를 실행하기 전에 진행률 대화 상자를 표시하십시오. 3. 실행 후 메서드에서 대화 상자를 닫습니다.