Android ¿Cómo volver a conectar a AsyncTask después onDestroy () y relanzar onCreate ()?

He probado la declaración de que AsyncTasks no se destruyen junto con su actividad de lanzamiento. Y es verdad .

Hice el AsyncTask apenas publicar un mensaje de Log.i() cada 3 segundos por 1 minuto. Y puse Log.i() messsage en el método onDestroy() de la actividad.

Veo que la actividad se destruye, pero el AsyncTask continúa funcionando hasta que termina todos los 20 Log.i() de Log.i() .

Y estoy confundido.

  1. ¿Qué pasa si el AsyncTask tenía publishProgress() en la interfaz de usuario destruida?
    Supongo que algún tipo de excepción ocurriría, ¿verdad?

  2. ¿Qué pasa si el AsyncTask almacena datos en una variable global de la class Application ?
    No hay idea aquí, NullPointer excepción?

  3. ¿Qué pasa si la aplicación se reinicia?
    Probablemente lanzará una nueva AsyncTask. ¿Se puede volver a conectar con AsyncTask?

  4. ¿Es AsyncTask inmortal después de que la aplicación madre se destruye?
    Tal vez sí, ¿cómo todas las aplicaciones de LogCat siguen registrando mensajes mientras la aplicación de interfaz de usuario ya no es visible, tal vez destruida? Y cuando vuelves a abrirlos te muestran los mensajes que se generaron mientras estaba 'muerto'.

Todo esto parece una discusión, pero la pregunta está en el título. Tengo este AsyncTask huérfano, que me gustaría mucho volver a conectar a cuando la aplicación se relanza, pero no sé cómo hacerlo.

Me olvidé de decir por qué esto es muy importante. La aplicación se destruye cuando se produce un cambio de orientación. Y no quiero perder los datos producidos por el AsyncTask, no quiero detenerlo y reiniciarlo. Sólo quiero que siga y vuelva a conectar después de los cambios de orientación se hacen.

Espero tener este derecho ya que es de algún código antiguo que ya no uso (ahora uso un IntentService para hacer lo que solía hacer).

Esto es lo que originalmente tenía cuando descargé archivos en mi Activity principal …

 public class MyMainActivity extends Activity { FileDownloader fdl = null; ... // This is an inner class of my main Activity private class FileDownloader extends AsyncTask<String, String, Boolean> { private MyMainActivity parentActivity = null; protected void setParentActivity(MyMainActivity parentActivity) { this.parentActivity = parentActivity; } public FileDownloader(MyMainActivity parentActivity) { this.parentActivity = parentActivity; } // Rest of normal AsyncTask methods here } } 

La clave es usar onRetainNonConfigurationInstance() para 'guardar' el AsyncTask .

 Override public Object onRetainNonConfigurationInstance() { // If it exists then we MUST set the parent Activity to null // before returning it as once the orientation re-creates the // Activity, the original Context will be invalid if (fdl != null) fdl.setParentActivity(null); return(fdl); } 

Entonces tengo un método llamado doDownload() que se llama desde onResume() si un Boolean indicando downloadComplete es cierto. El valor Boolean se establece en el onPostExecute(...) de FileDownloader .

 private void doDownload() { // Retrieve the FileDownloader instance if previousy retained fdl = (FileDownloader)getLastNonConfigurationInstance(); // If it's not null, set the Context to use for progress updates and // to manipulate any UI elements in onPostExecute(...) if (fdl != null) fdl.setParentActivity(this); else { // If we got here fdl is null so an instance hasn't been retained String[] downloadFileList = this.getResources().getStringArray(R.array.full_download_file_list); fdl = new FileDownloader(this); fdl.execute(downloadFileList); } } 
  • OnSaveInstanceState / onPause - espera hasta que el estado se salve por completo antes de permitir que se procese el proceso
  • Cómo probar el método Activity onDestroy
  • Android mantiene el estado de devolución de llamada después del cambio de configuración
  • Vida de la aplicación Android: tal vez infinita?
  • Realizando operaciones de larga duración en onDestroy
  • Ciclo de vida de la actividad lado a lado
  • La aplicación se comporta diferente después de salir y volver a entrar
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.