Android – SQLite ContentResolver insertar / eliminar / actualizar en UI Thread?

He mirado a través de muchos ejemplos / tutoriales de uso de SQLite en Android. Digamos que tiene una aplicación que utiliza SQLite, ContentProvider , CursorLoader , un CursorAdapter personalizado. Ahora todos los ejemplos principales de esto que he encontrado confían en un CursorLoader para buscar los datos al CursorAdapter , que por la naturaleza de CursorLoader sucede en una manera segura del hilo de Async-UI. Sin embargo, estos mismos ejemplos hacen todas las llamadas insert / delete / update a través de ContentResolver en el hilo principal (por ejemplo, onClick , onResume , onPause ). ( Ejemplo ) No envuelven estas llamadas en un AsyncTask o iniciar un subproceso independiente o utilizar el AsyncQueryHandler . ¿Por qué es esto, cómo pueden tantos blogs / ejemplos bien escritos hacer un error tan obvio? ¿O son sencillas las llamadas de inserción / eliminación / actualización de una sola fila tan rápidas que son lo suficientemente seguras para lanzarse desde el hilo Main / UI? ¿Cuál es la forma correcta de hacer estas llamadas rápidas?

También me confundí acerca de las muestras haciendo llamadas en el hilo principal. Supongo que las muestras simplemente simplificaron las demostraciones evitando hilos adicionales y devoluciones de llamada, ya que la única inserción / actualización / eliminación de la llamada puede volver rápidamente.

Además del patrón Loader para consulta, android proporcionó una clase auxiliar AsyncQueryHandler, desde el nivel 1 de la API, para las operaciones CRUD asíncronas con las devoluciones de llamada CRUD completas admitidas. El AsyncQueryHandler trabaja dentro con un HandlerThread para las operaciones asíncronas y entrega los resultados al hilo principal.

Por lo tanto, creo que las consultas ContentProvider deben ejecutarse en hilos de trabajo distintos de la interfaz de usuario, y esas muestras pueden no ser las mejores prácticas de acuerdo con el diseño oficial.

Editar

Encontrado una anotación de los documentos oficiales del marco, vea esto o esto , Línea 255:

 In practice, this should be done in an asynchronous thread instead of on the main thread. For more discussion, see Loaders. If you are not just reading data but modifying it, see {@link android.content.AsyncQueryHandler}. 

=== editar 2 Enlace a la actual guía de dev Android que contiene la cita anterior

Esta pregunta ha estado en mi mente desde hace mucho tiempo. Supongo que esto depende de la complejidad del archivo que estamos intentando insertar, actualizar o eliminar. Si nuestra aplicación va a insertar o actualizar archivos grandes, siempre sería correcto hacerlo de forma asíncrona y si los archivos no van a ser tan grande, ejecutarlo en el hilo de interfaz de usuario se puede hacer.

Sin embargo, siempre se recomienda continuar con las operaciones de la base de datos en un hilo separado.

Creo que has respondido a tu propia pregunta. Creo que CursorLoader extiende AsyncTaskLoader. Las llamadas realizadas desde un subproceso de interfaz de usuario sólo procesan la llamada a CusorLoader (que utiliza AsyncTask.) Lo que se está haciendo por la llamada todavía no se produce en el subproceso de interfaz de usuario. Hacer una llamada a un método / función que ejecuta las cosas en un subproceso separado todavía está haciendo trabajo lejos del subproceso de UI.

¿Qué trabajo crees que está sucediendo en el hilo de la interfaz de usuario?

Por favor, muestre el registro de depuración si es posible o ejemplo donde cree que el trabajo se realiza en la interfaz de usuario. No debería ser.

¿No intentar discutir sólo quiere saber cómo ha llegado a la conclusión de trabajo de la interfaz de usuario?

  • No error "Sólo el subproceso original que creó una jerarquía de vista puede tocar sus vistas" cuando la vista se actualiza sin demora
  • DoInBackground llama a AsyncTask entonces duerme bloques UI Thread
  • ¿Qué sucede con un AsyncTask cuando la actividad de lanzamiento se detiene / destruye mientras todavía se está ejecutando?
  • ¿Es posible usar AsyncTask en una clase de servicio?
  • Android, creando un hilo sencillo que actualizará mi contador de segundos
  • ¿OnPreExecute () y onPostExecute () se ejecutan en el subproceso de interfaz de usuario o en el subproceso desde el que se inició AsyncTask?
  • Cómo actualizar la interfaz de usuario desde el servicio de Android utilizando RxJava / RxAndroid
  • No se puede crear el controlador dentro de hilo que no ha llamado Looper.prepare ()
  • Manejar, quiero correr periódicamente
  • Cómo saber si este hilo es un hilo de interfaz de usuario
  • Android - llamando al hilo de ui del hilo de trabajo
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.