una tutorial tiempo thread tareas tarea studio son servicios segundo runonuithread que plano las ejemplo ejecutar como cierto cada asynctask asincronas android eclipse android-asynctask

android - tutorial - ¿Cómo puedo depurar el código doInBackground de una AsyncTask?



servicios en segundo plano android studio (5)

En su doInBackground () agregue lo siguiente ...

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.. }

`

Tengo puntos de interrupción establecidos, pero parece que se ignoran (o nunca se han visto).

Mi código está abajo. Estoy tratando de hacer una copia de seguridad de una db sql en una tarjeta SD.

Cuando LO EJECUTO (no en modo de depuración) en eclipse, recibo el mensaje de onPreExecute y seguí en breve el mensaje de onPostExecute.

Tengo puntos de interrupción establecidos en casi todas las líneas de ExportDatabaseFileTask.

Cuando LO EJECUTO (en modo Debug) en eclipse, me detengo en los puntos de interrupción en onPreExecute, y luego, cuando paso más, LA LÍNEA MUY SIGUIENTE a la que va el Depurador es:

mDbHelper.open ();

Luego paso por el resto del código normal y me quedo con el AVD que muestra el mensaje de onPreExecute, donde aparentemente se mantendrá PARA SIEMPRE.

NO veo ninguna de las líneas BREAKPOINTED en:

doInBackground onPostExecute copyFile

Por lo tanto, respetuosamente no estoy de acuerdo con el comentario de que no tengo un punto de corte o que no se está ejecutando. Entonces, voy a responder mi pregunta: ¿Cómo depuras (PASO A TRAVÉS) el código de fondo 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(); } } }

}


Me enfrentaba a algo similar en Android Studio. Para mí, se debió a que Proguard estaba activo durante la depuración. Proguard estaba arruinando los números de línea después de disminuir. Puede deshabilitar Proguard eliminando minfyEnabled true de su build.gradle


Si se ejecuta otra tarea asíncrona en segundo plano, entonces puede que haya una nueva omisión para ejecutar el método doinbackground, así que intente ejecutar como:

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


Si se ignoran, entonces es probablemente uno de estos dos:

  1. Usted ejecuta el proyecto no en modo de depuración.
  2. Nunca realmente alcanzas esas líneas durante la ejecución.