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.
- ¿Los objetos de Scala sobreviven a que la actividad se reinicie en Android?
- Ciclo de vida de la actividad de Android después de salir del sueño
- Repetición inesperada de "nombre del paquete" mientras se reanudaba en '' nombre del paquete '' Error en Android
- ¿Cómo probar el código construido para salvar / restaurar el ciclo de vida de una actividad?
- Android - Tiempo de vida de las diferentes opciones de almacenamiento
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.
-
¿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? -
¿Qué pasa si el AsyncTask almacena datos en una variable global de la
class Application
?
No hay idea aquí, NullPointer excepción? -
¿Qué pasa si la aplicación se reinicia?
Probablemente lanzará una nueva AsyncTask. ¿Se puede volver a conectar con AsyncTask? -
¿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.
- Método de clase de aplicación Android onCreate que se llama varias veces
- Ciclo de vida de la actividad de Android: orden de estado cuando se inicia una nueva actividad
- Implementación de Android de los métodos de ciclo de vida puede llamar a la aplicación de superclase después de hacer cualquier trabajo?
- ¿Cómo comprobar si una actividad es la última en la pila de actividades de una aplicación?
- Permitir que el diálogo se muestre antes o durante onPause ()?
- Qué métodos se invocan en el ciclo de vida de la actividad en los siguientes casos:
- ¿Cómo funcionan los ciclos de vida de la actividad de Android en relación con la aplicación completa?
- Android ¿cuánto tiempo nuestra actividad estará allí en la pila
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); } }
- ¿Cómo puedes localizar una oración con un número dinámico de conjunciones?
- Android – Aplicaciones instaladas – comprobación de integridad