¿Es apropiado SQL o acceso general a archivos en el hilo principal de la interfaz de usuario de Android?
Estoy tratando de seguir las mejores prácticas de Android, por lo que en el modo de depuración activaré todas las siguientes opciones:
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder().detectAll().penaltyLog().build()); //detect and log all thread violations StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder().detectAll().penaltyLog().build()); //detect and log all virtual machine violations
Android ahora me grita cuando intento utilizar cualquier tipo de acceso a archivos o SQL en el subproceso principal (UI). Pero veo muchas recomendaciones para usar el acceso a archivos y / o SQL en el hilo principal. Por ejemplo, la actividad principal debe cargar los valores de preferencia predeterminados dentro de onCreate()
en caso de que aún no se hayan configurado:
- Servicio de Android e hilo de la interfaz de usuario
- Diferencia entre Handler.post (Runnable r) y Activity.runOnUiThread (Runnable r)
- Configuración de TextView visible desde otro hilo o BeginInvoke en Android
- Android - llamando al hilo de ui del hilo de trabajo
- Cómo utilizar runOnUiThread
PreferenceManager.setDefaultValues(context, resId, readAgain);
Oops — que resulta en un acceso de archivo en la primera ejecución de la aplicación, porque onCreate()
se llama en el subproceso de la interfaz de usuario. La única manera alrededor de él que puedo ver es comenzar un hilo de rosca separado — que introduce una condición de la competencia con el otro código de UI que pudo leer las preferencias y esperar los valores del defecto para estar fijado ya.
Piensa también en servicios como el DownloadManager. (En realidad, es tan buggy que es inútil en la vida real, pero vamos a fingir que funciona por un segundo.) Si haces la cola de una descarga, se obtiene un evento (en el hilo principal) diciéndole una descarga ha terminado. Para conseguir realmente la información sobre esa transferencia directa (le da solamente una identificación de la transferencia directa), usted tiene que consultar el DownloadManager — que implica un cursor, dándole un error si usted tiene una política terminante encendida.
Entonces, ¿cuál es la historia — está bien para acceder a los cursores en el hilo principal? ¿O es algo malo, y la mitad del equipo de desarrollo de Android y los autores de libros de Android se olvidaron de eso?
- ¿Es una buena práctica crear AsyncTask anónima para paralelo pequeño proceso de congelación conocido?
- Manejar, quiero correr periódicamente
- ¿Por qué sólo el subproceso de interfaz de usuario en Android puede actualizar la interfaz de usuario?
- ¿Qué sucede con un AsyncTask cuando la actividad de lanzamiento se detiene / destruye mientras todavía se está ejecutando?
- ¿Qué es el UiThread de Android (subproceso de interfaz de usuario)
- Cómo actualizar la interfaz de usuario desde el servicio de Android utilizando RxJava / RxAndroid
- Admob: Cómo cargar AdRequest fuera de UI Thread?
- ¿Por qué se utiliza un único modelo de subproceso para actualizar la interfaz de usuario como subproceso principal?
La única manera alrededor de él que puedo ver es comenzar un hilo de rosca separado — que introduce una condición de la competencia con el otro código de UI que pudo leer las preferencias y esperar los valores del defecto para estar fijado ya.
A continuación, utilice un AsyncTask
, poniendo la llamada setDefaultValues()
en doInBackground()
y el "otro código UI que puede leer las preferencias" en onPostExecute()
.
Para conseguir realmente la información sobre esa transferencia directa (le da solamente una identificación de la transferencia directa), usted tiene que consultar el DownloadManager — que implica un cursor, dándole un error si usted tiene una política terminante encendida.
Así que consulta el DownloadManager
en un hilo de fondo.
Entonces, ¿cuál es la historia — está bien para acceder a los cursores en el hilo principal?
Eso depende de su definición de "bien".
En Android 1.x y la mayoría de los dispositivos 2.x, el sistema de archivos utilizado es YAFFS2, que basicamente serializa todo el acceso a disco en todos los procesos. El efecto neto es que mientras que su código puede aparecer suficientemente activo en aislamiento, parece lento a veces en la producción debido a otras cosas que suceden en el fondo (por ejemplo, la descarga de correo electrónico nuevo).
Si bien esto es un poco menos de un problema en Android 3.xy superior (se cambió a ext4), no hay duda de que el flash I / O es todavía relativamente lento – sólo será un poco más previsiblemente lento.
StrictMode
está diseñado para señalar dónde puede ocurrir la lentitud. Depende de usted determinar cuáles son benignos y cuáles no. En un mundo ideal, los limpiarías a todos; En un mundo ideal, tendría cabello.
¿O es algo malo, y la mitad del equipo de desarrollo de Android y los autores de libros de Android se olvidaron de eso?
Siempre ha sido una "cosa mala".
No puedo hablar de "la mitad del equipo de desarrollo de Android". Supongo que, desde el principio, ellos esperaban que los desarrolladores aplicaran su experiencia de desarrollo existente para detectar el comportamiento lento – esto no es significativamente diferente de los problemas de rendimiento en cualquier otra plataforma. Con el tiempo, han estado ofreciendo más patrones para orientar a los desarrolladores en un camino positivo (por ejemplo, el marco de Loader
), además de cambios a nivel de sistema (por ejemplo, YAFFS2-> ext4) para hacer esto un problema menor. En parte, están tratando de abordar los lugares en los que Android presenta desafíos distintos relacionados con el rendimiento, como la interfaz de usuario de un solo thread.
Del mismo modo, no puedo hablar de todos los autores de libros de Android. Ciertamente no me concentré en los problemas de rendimiento en las primeras ediciones de mis libros, ya que me estaba centrando en las características y funciones de Android. Con el tiempo, he añadido más consejos en estas áreas. También he contribuido código de código abierto relacionado con estos temas. En 2012, estaré haciendo revisiones masivas a mis libros, y creando más proyectos de código abierto, para seguir abordando estos temas. Sospecho, dado su tono, que yo (y probablemente otros) son fracasos completos en sus ojos en este aspecto, y usted es ciertamente bienvenido a su opinión.
- Cómo convertir imágenes en vídeo en android con javacv?
- Cómo obtener sólo los contactos favoritos / favoritos mediante ContactsContract