¿Qué sucede con un hilo de Android después de destruir la actividad que lo creó?
En mi aplicación para Android, la actividad principal a veces inicia un Thread para cargar datos desde un servidor. Este hilo modifica la base de datos de la aplicación y edita algunos archivos importantes. AFAIK, parecería que este hilo continúa ejecutándose. ¿Qué pasará con este hilo si el Android entra en una situación de baja memoria y decide matar a toda la aplicación? ¿Habrá alguna vez una situación en la que este hilo podría morir prematuramente? Si es así, ¿hay alguna manera de ver que el hilo se está matando, y hacer algo al respecto?
Estoy preguntando porque este hilo modifica datos importantes en la base de datos, y si de repente se mata, la aplicación podría dejar de funcionar correctamente.
- Error de acceso de realm de subproceso incorrecto al usar código compartido entre IntentService y AsyncTask (Android)
- Android: ¿Cuándo debo usar un Handler () y cuándo debo usar un Thread?
- Cuando el hilo de trabajo funciona, la interfaz de usuario se vuelve intermitente
- ¿Cómo implementar la función .get con FutureTask o BackgroundTask usando android?
- La interrupción de subproceso no funciona (Java Android)
- Cómo reducir la latencia de Thread.sleep () en Android
- Acceso al dominio desde un subproceso incorrecto Android
- Android: Dos instancias de Media Recorder al mismo tiempo
- Android hilo problema, ¿por qué ui todavía bloquea cuando he utilizado un hilo de trabajo?
- Cliente personalizado para la autenticación de WebTokens
- Juegos de sincronización de Java: sincronizados && wait && notify
- Acceso al controlador de subprocesos de interfaz de usuario desde un servicio
- Qué cosas se ejecutan en el hilo principal de la interfaz de usuario al abrir una aplicación para Android
AFAIK, parecería que este hilo continúa ejecutándose.
Esto es cierto, pero no tiene ninguna garantía de cuánto tiempo el hilo permanecerá vivo.
¿Qué pasará con este hilo si el Android entra en una situación de baja memoria y decide matar a toda la aplicación?
Esto es en realidad un caso bastante raro en mi experiencia, pero dependerá de la memoria disponible del dispositivo y del comportamiento del usuario, por ejemplo, utilizan el dispositivo pesadamente y comienzan varias aplicaciones.
¿Habrá alguna vez una situación en la que este hilo podría morir prematuramente?
Sí
Si es así, ¿hay alguna manera de ver que el hilo se está matando, y hacer algo al respecto?
No
Estoy preguntando porque este hilo modifica datos importantes en la base de datos, y si de repente se mata, la aplicación podría dejar de funcionar correctamente.
Lo que usted describe podría ser clasificado como algo que es "misión crítica". Como las otras dos respuestas han señalado, un servicio sería una forma más robusta de hacer las cosas como un servicio es una de las últimas cosas que se "mató" en una situación de memoria baja. El uso de START_REDELIVER_INTENT puede ayudar a reanudar lo que estaba haciendo.
En cualquier caso, si tiene una operación de "misión crítica", necesita diseñar su código para la recuperación completa, como el uso de transacciones y la posibilidad de reversiones en caso de errores.
Parece que deberías mover la actualización de db a un servicio. Una vez que una actividad pasa al fondo, Android asume que su proceso puede ser eliminado si es necesario y reiniciado más tarde sin efectos nocivos. Consulte Fundamentos de la aplicación para obtener más información.
Debe utilizar un servicio:
Debido a que un proceso que ejecuta un servicio se clasifica más alto que un proceso con actividades de fondo, una actividad que inicia una operación de larga duración podría hacer bien iniciar un servicio para esa operación, en lugar de simplemente crear un hilo de trabajo, superar la actividad.
Echa un vistazo aquí: http://developer.android.com/guide/topics/fundamentals/processes-and-threads.html#Lifecycle (donde se origina el texto que pegue)
Podría estar cavando un hilo viejo, pero nadie mencionó una cosa importante.
Cada vez que utilice una base de datos y modifique varias filas, debe utilizar transacciones para garantizar que los datos permanezcan válidos en caso de cualquier tipo de error (que podría ser, por ejemplo, la terminación de un subproceso, una excepción de socket, etc.).
try{ db.beginTransaction(); //Do whatever you need to do... db.setTransactionSuccessful(); }catch(SQLiteException e){ Log.e("SQLite","Error while updating rows: " + e.getMessage()); }finally{ db.endTransaction(); //Commit (if everything ok) or rollback (if any error occured). db.close(); //Close databse; }
- Cómo detener y reiniciar una actividad en una prueba de instrumentación de Android?
- "La conversión al formato Dalvik falló con error 1" – sólo en exportación