2011-08-13 5 views
16

У меня есть точки останова, но они, кажется, игнорируются (или никогда не видели).Как я могу отлаживать doInBackground код AsyncTask

Мой код ниже. Я пытаюсь сделать резервную копию sql db на SD-карту.

Когда я запускаю его (не режим отладки) в eclipse, я получаю сообщение от onPreExecute и вскоре за ним следует сообщение из onPostExecute.

У меня есть BreakPoints, установленный почти в каждой строке ExportDatabaseFileTask.

Когда я запустить его (в режиме отладки) в затмении, я останавливаться на контрольных точках в onPreExecute, а затем, как я шаг дальше, уже на следующую ЛИНИЯ отладчик переходит в это:

mDbHelper.open() ;

Затем я перехожу через остальную часть обычного кода и оставляю AVD, показывая сообщение от onPreExecute, если он, по-видимому, будет STAY FOREVER.

Я не вижу какой-либо из линий BREAKPOINTED в:

doInBackground onPostExecute CopyFile

Итак, я должен не согласиться с замечанием, что у меня нет его breakpointed или не выполняются. Итак, я задам свой вопрос: как вы отлаживаете (STEP THROUGH) doInBackground код 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

Try поставить Log.d() в задаче –

+0

@Tom Wruble - вы добавили 'Log.d()' prints в 'doInBackground'? были ли они напечатаны? – MByD

+0

Я читаю промежутки между строками, но кажется, что вы (хотя и не актуалистично говорите) не можете пройти через весь код в AsyncTask и что он просто отлаживает его через инструкцию Log. Если это правда, круто, я могу справиться с этим. Но сначала вы сказали, что я либо не установил точки останова, либо что кодекс не был выполнен, что, безусловно, означает, что вы можете выполнить код в AysyncTask через Debug. –

ответ

2

Если они игнорируются, то это, вероятно, один из этого два:

  1. Вы запускаете проект не в режиме отладки.
  2. Вы никогда не достигаете этих линий во время выполнения.
39

проверить это How do I use the Eclipse debugger in an AsyncTask when developing for Android?

Поместите следующий фрагмент кода в начале doInBackground()

if(android.os.Debug.isDebuggerConnected()) 
    android.os.Debug.waitForDebugger(); 

Затем, когда вы установите контрольную точку в этом потоке, затмение будет найти его.

Предоставлено: Саргас

4

В вашем doInBackground() добавить 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

я что-то подобное в Android Studio облицовку. Для меня это было связано с активностью Proguard во время отладки. Proguard испортил номера строк после извлечения. Вы можете отключить Proguard, удалив minfyEnabled true из вашей сборки.Gradle

0

Если другой Асинхронный Task работает в фоновом режиме, то может быть новый один пропуск запустить doinbackground метод, поэтому старайтесь работать как:

(new ExampleAsyncTask()).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); 
Смежные вопросы