estoy tratando de seguir las mejores prácticas de Android, por lo que en el modo de depuración enciendo la siguiente información en:¿Es apropiado el acceso de archivos SQL o generales en el hilo de la interfaz de usuario principal de Android?
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 principal (UI) hilo. Pero veo tantas recomendaciones para usar acceso a archivos y/o SQL en el hilo principal. Por ejemplo, la actividad principal debe cargar los valores por defecto de preferencia dentro onCreate()
en caso de que no se han fijado todavía:
PreferenceManager.setDefaultValues(context, resId, readAgain);
Vaya --- que da como resultado un acceso a archivos en la primera ejecución de la aplicación, ya que se llama onCreate()
en el hilo de la interfaz de usuario La única forma de evitarlo que puedo ver es comenzar un hilo separado --- que introduce una condición de carrera con otro código de UI que podría leer las preferencias y esperar que los valores predeterminados ya estén establecidos.
Piense también en servicios como el DownloadManager. (En realidad, es tan defectuoso que es inútil en la vida real, pero imaginemos que funciona por un segundo.) Si pone en cola una descarga, obtiene un evento (en el hilo principal) indicándole que la descarga ha finalizado. Para obtener realmente información sobre esa descarga (solo le da una ID de descarga), debe consultar el DownloadManager --- que implica un cursor, que le da un error si tiene activada una política estricta.
¿Cuál es la historia --- ¿está bien 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 olvidó de eso?
PreferenceManager.setDefaultValues no implica SQL. SharedPreferences son todos archivos XML planos. –
Sí, ha pasado una semana --- No recuerdo. He editado la pregunta para señalar que se trata de un acceso de archivo --- que es el mismo punto. Gracias por notar esto –
Ahora en el emulador de Android 4.2.2, al usar 'PreferenceManager.setDefaultValues (context, resId, readAgain)' al comenzar desde un subproceso generado _no_ el subproceso principal evitará que la actividad se infle con un seguimiento de pila larga que incluya "java". lang.RuntimeException: No se puede crear el controlador dentro de la cadena que no ha llamado a Looper.prepare() ". Por lo tanto, parece que no solo está bien acceder a los archivos en el hilo principal, sino que ahora es obligatorio en lo que respecta a establecer valores de preferencia predeterminados. –