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();
}
}
}
}
intenta poner un Log.d() en la tarea –
@Tom Wruble: ¿ha agregado 'Log.d()' imprime a 'doInBackground'? fueron impresos? – MByD
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. –