2011-08-13 14 views
16

Tengo puntos de interrupción establecidos, pero parecen ignorarse (o nunca se han visto).¿Cómo puedo depurar código DoInBackground de una AsyncTask

Mi código está por debajo. Estoy intentando hacer una copia de seguridad de un sql db a una tarjeta SD.

Cuando lo EJECUTO (no modo de depuración) en eclipse, recibo el mensaje de onPreExecute y lo sigo en breve por el mensaje de onPostExecute.

Tengo BreakPoints establecidos en casi todas las líneas de ExportDatabaseFileTask.

al ejecutarlo (en modo de depuración) en eclipse, me paro en los puntos de interrupción en OnPreExecute, y luego como I paso más, la línea siguiente del depurador va a es:

mDbHelper.open() ;

Paso por el resto del código normal y me queda el AVD que muestra el mensaje del onPreExecute, donde aparentemente PERMANECER PARA SIEMPRE.

no veo ninguna de las líneas BREAKPOINTED en:

doInBackground onPostExecute copyFile

Por lo tanto, tengo que discrepar respetuosamente con el comentario de que no tengo que breakpointed o no lo es ser ejecutado. Entonces, haré mi pregunta: ¿Cómo se depura (PASO A TRAVÉS) del código doInBackground de una 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

intenta poner un Log.d() en la tarea –

+0

@Tom Wruble: ¿ha agregado 'Log.d()' imprime a 'doInBackground'? fueron impresos? – MByD

+0

Estoy leyendo entre líneas, pero parece que (aunque no lo dice en realidad) no puede recorrer todos los códigos en una AsyncTask, y que la forma correcta de depurarlo es a través de la declaración de Log. Si eso es cierto, genial, puedo lidiar con eso. Pero al principio dijiste que no había establecido puntos de interrupción o que el codxe no se había ejecutado, lo que ciertamente IMPLICA que PUEDES pasar el código en una AysyncTask a través de Debug. –

Respuesta

2

Si se ignoran, entonces es probable que uno de estos dos:

  1. ejecute el proyecto no está en modo de depuración.
  2. Nunca llega a esas líneas durante la ejecución.
4

En su doInBackground() añadir el 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

que estaba frente a algo similar en Android Studio. Para mí, fue debido a Proguard estar activo durante la depuración. Proguard estaba estropeando los números de línea después de minificar. Puede deshabilitar Proguard eliminando minfyEnabled true de su compilación.Gradle

0

Si otro asíncrono de tareas se ejecuta en segundo plano, a continuación, puede ser uno nuevo salto para funcionar doinbackground método, a fin de tratar de correr como:

(new ExampleAsyncTask()).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); 
Cuestiones relacionadas