update studio proveedores proveedor programacion definicion content contenido android android-contentprovider

android - studio - ¿Qué hilo ejecuta ContentProvider?



proveedores de contenido android (2)

Si llamo a un ContentProvider desde una actividad, ¿en qué hilo se está ejecutando ContentProvider?

Por ejemplo, ¿qué sucede si se cancela la actividad y se ejecuta una consulta en el ContentProvider? Digamos que tienes una consulta de red lenta para f.ex.


Me encontré con esto mientras solucionaba un problema en el que un proceso remoto (distinto de la IU) en la misma aplicación generaba continuamente el proveedor de contenido cada vez que realizaba una consulta. Desafortunadamente, a menos que escriba algo personalizado, los ContentProviders nunca se destruyen mientras se esté ejecutando un proceso. El proveedor de contenido normalmente se ejecuta en el subproceso del proceso de la IU (que no estaba abierto), por lo que en este caso de un proceso remoto que consulta al proveedor de contenido, generará una nueva instancia del proveedor de contenido en cada consulta porque ese proceso separado (subproceso de la IU) fue No se ejecuta en el momento.

Tal vez haya una mejor manera de hacerlo, pero en lugar de gastar un montón de esfuerzo para crear mi propia db o proveedor de contenido para cerrar la db y los recursos en cada creación, descubrí una solución sencilla.

Resulta que tiene la misma capacidad de ejecutarse en un proceso separado como lo hace un servicio. Entonces, en mi ejemplo, simplemente moví el proveedor de contenido al mismo proceso donde se encontraba el servicio remoto. Problema resuelto, ahora el proveedor de contenido se ejecuta en el mismo proceso y solo se genera una vez mientras el servicio se está ejecutando. También puedes ver el atributo de android: multiprocess .


Si te refieres al caso de uso normal de usar un ContentResolver para llamar a un ContentProvider, aquí está lo que sucede de acuerdo con mi mejor conocimiento:

  1. En este ejemplo, asumo que su Proveedor de contenido vive en un proceso y su Actividad en otro.

  2. Si no se ha creado el ContentProvider, se llama al método onCreate () usando el hilo "principal" del proceso de la aplicación.

  3. Los métodos de consulta () / insert () / update () / delete () se llaman usando BinderThreads que se encuentran en cada proceso de aplicación esperando comandos entrantes de otros procesos.

Entonces, ¿qué sucede si la Actividad que activó la consulta () / insert () / etc se cancela en medio de una de estas llamadas de método? No puedo decirlo con certeza, pero estoy bastante seguro de que todo lo que ocurra en ContentProvider continuará porque el proceso de ContentProvider no se verá afectado, pero no puedo decir con certeza lo que sucede después de ese método.

No estoy seguro de cómo se involucraría una red lenta en esto a menos que su proveedor de contenido esté respaldado por una red en lugar de la base de datos sqlite habitual.

Aclaración:

Hay dos posibilidades al invocar una función ContentProvider (consulta / insertar / actualizar / eliminar / etc):

  1. Su ContentProvider está en el mismo proceso que la persona que llama. Si es así, la función ContentProvider se ejecuta de forma síncrona en el mismo hilo que el llamador.

  2. Su ContentProvider se encuentra en un proceso diferente al que llama. Si es así, la función ContentProvider se ejecuta en un subproceso de enlace en el proceso ContentProvider.

En ambos casos, la persona que llama queda bloqueada hasta que la función ContentProvider regresa. Como siempre, lea la documentación completa de Google y / o el código fuente de AOSP.

http://developer.android.com/reference/android/content/ContentProvider.html http://developer.android.com/guide/topics/providers/content-provider-basics.html http://developer.android.com/guide/components/processes-and-threads.html