¿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:

 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?

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.

  • No se puede crear el controlador dentro de hilo que no ha llamado Looper.prepare () 3
  • Android, creando un hilo sencillo que actualizará mi contador de segundos
  • No se puede crear el controlador dentro de hilo que no ha llamado Looper.prepare ()
  • IU de Android: ¿cuándo puedo modificar directamente una vista?
  • Android ViewPager cambia automáticamente la página
  • ¿OnPreExecute () y onPostExecute () se ejecutan en el subproceso de interfaz de usuario o en el subproceso desde el que se inició AsyncTask?
  • Android: ¿Posible que el hilo de fondo bloquee hasta que el hilo de UI finalice la operación?
  • DoInBackground llama a AsyncTask entonces duerme bloques UI Thread
  • ¿Es posible usar AsyncTask en una clase de servicio?
  • No se muestra la vista de Android después del método addView
  • Animación de una vista mientras que ListView no está funcionando
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.