2011-08-13 29 views
16

Tôi đã đặt các điểm ngắt nhưng dường như chúng bị bỏ qua (hoặc không bao giờ được nhìn thấy).Làm cách nào để tôi có thể gỡ lỗi mã DoBackBackground của AsyncTask

Mã của tôi ở bên dưới. Tôi đang cố gắng để sao lưu một db sql vào một thẻ SD.

Khi tôi chạy nó (không phải chế độ Gỡ lỗi) trong nhật thực, tôi nhận được thông báo từ onPreExecute và sau đó ngay sau thông báo từ onPostExecute.

Tôi có BreakPoints được đặt trong hầu hết mọi dòng của ExportDatabaseFileTask.

Khi tôi chạy nó (ở chế độ Debug) trong nhật thực, tôi dừng lại ở breakpoint trong onPreExecute, và sau đó khi tôi bước xa hơn, THE LINE RẤT TIẾP Debugger đi vào là:

mDbHelper.open() ;

Tôi sau đó bước qua phần còn lại của mã bình thường và trái với wD AVD hiển thị thông báo từ onPreExecute, nơi nó dường như sẽ KHÔNG BAO GIỜ.

Tôi không thấy bất kỳ của các dòng BREAKPOINTED trong:

doInBackground onPostExecute copyFile

Vì vậy, tôi phải trân trọng không đồng ý với nhận xét rằng tôi không có nó breakpointed hoặc nó không phải là đang được thực hiện. Vì vậy, tôi sẽ reask câu hỏi của tôi: Làm thế nào để bạn gỡ lỗi (STEP THROUGH) doInBackground mã của một AsyncTask?

 case BACKUP_ID: 
      if (ScoreAGame.this.isExternalStorageAvail()) { 
       mDbHelper.close(); 
       new ExportDatabaseFileTask().execute(); 
       mDbHelper.open(); 
      } else { 
       Toast.makeText(ScoreAGame.this, "External storage is not available, unable to export data.", 
          Toast.LENGTH_SHORT).show(); 
      } 
      return true; 
     case RESTORE_ID: 
      selectCourse(); 
      return true; 
    } 

    return super.onMenuItemSelected(featureId, item); 
} 

private boolean isExternalStorageAvail() { 
    return Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED); 
} 

private class ExportDatabaseFileTask extends AsyncTask<String, Void, Boolean> { 
    private final ProgressDialog dialog = new ProgressDialog(ScoreAGame.this); 

    // can use UI thread here 
    protected void onPreExecute() { 
     this.dialog.setMessage("Exporting database..."); 
     this.dialog.show(); 
    } 

    // automatically done on worker thread (separate from UI thread) 
    protected Boolean doInBackground(final String... args) { 

     File dbFile = 
      new File(Environment.getDataDirectory() + "/data/com.discgolf/databases/discgolfdb.db"); 

     File exportDir = new File(Environment.getExternalStorageDirectory(), "discgolfbackup"); 
     if (!exportDir.exists()) { 
      exportDir.mkdirs(); 
     } 
     File file = new File(exportDir, dbFile.getName()); 

     try { 
      file.createNewFile(); 
      this.copyFile(dbFile, file); 
      return true; 
     } 
     catch (IOException e) { 
      Log.e(TAG, e.getMessage(), e); 
      return false; 
     } 
    } 

    // can use UI thread here 
    protected void onPostExecute(final Boolean success) { 
     if (this.dialog.isShowing()) { 
      this.dialog.dismiss(); 
     } 
     if (success) { 
      Toast.makeText(ScoreAGame.this, "Export successful!", Toast.LENGTH_SHORT).show(); 
     } else { 
      Toast.makeText(ScoreAGame.this, "Export failed", Toast.LENGTH_SHORT).show(); 
     } 
    } 

    void copyFile(File src, File dst) throws IOException { 
     FileChannel inChannel = new FileInputStream(src).getChannel(); 
     FileChannel outChannel = new FileOutputStream(dst).getChannel(); 
     try { 
      inChannel.transferTo(0, inChannel.size(), outChannel); 
     } 
     finally { 
      if (inChannel != null) { 
       inChannel.close(); 
      } 
      if (outChannel != null) { 
       outChannel.close(); 
      } 
     } 
    } 

}

+0

Cố gắng đặt một Log.d() trong nhiệm vụ –

+0

@Tom Wruble - bạn đã thêm bản in «Log.d()' vào 'doInBackground' chưa? chúng có được in không? – MByD

+0

Tôi đang đọc ở giữa các dòng, nhưng nó xuất hiện mà bạn (trong khi không actuially nói nó) không thể bước qua tất cả các mã trong một AsyncTask, và rằng cách onbly để gỡ lỗi nó là thông qua các báo cáo đăng nhập. Nếu đó là sự thật, tuyệt, tôi có thể giải quyết nó. Nhưng lúc đầu, bạn nói rằng tôi đã không thiết lập Breakpoints hoặc rằng codxe đã không được thực hiện, chắc chắn IMPLIES rằng bạn CÓ THỂ bước qua mã trong AysyncTask thông qua Debug. –

Trả lời

2

Nếu họ được bỏ qua, sau đó nó có thể là một trong hai điều này:

  1. Bạn chạy dự án không ở chế độ gỡ lỗi.
  2. Bạn không bao giờ thực sự đạt được các dòng đó trong quá trình thực thi.
4

Trong doInBackground của bạn() thêm following..`

protected Integer doInBackground(String... params) { 
    // for debug worker thread 
    if(android.os.Debug.isDebuggerConnected()) 
     android.os.Debug.waitForDebugger(); 

    // create the file with the given file path 
    File file = new File(params[0]); 

    // enter rest of the code here.. 
} 

'

0

tôi đã phải đối mặt với một cái gì đó tương tự như trong Android Studio. Đối với tôi, đó là do Proguard đang hoạt động trong quá trình gỡ lỗi. Proguard đã làm rối tung các số dòng sau khi rút gọn. Bạn có thể tắt Proguard bằng cách xóa minfyEnabled true khỏi bản dựng của mình.gradle

0

Nếu một Async nhiệm vụ đang chạy ở chế độ nền, sau đó có thể là một mới bỏ chạy doinbackground phương pháp, vì vậy hãy thử để chạy như:

(new ExampleAsyncTask()).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); 
Các vấn đề liên quan