2011-08-02 22 views
6

Estoy un poco confundido acerca de los proveedores de contenido. Si tengo varias actividades en mi aplicación, ¿cada una obtiene su propia instancia del proveedor de contenido? es solo esencialmente una clase/interfaz?Android - proveedores de contenido sqlite y multihilo

En una actividad tendré muchos hilos escribiendo simultáneamente en la base de datos. ¿Cómo trato de permitir que un hilo escriba a la vez?

¿Acabo de capturar SQLiteDatabaseLockedException, pongo el hilo a dormir y luego vuelvo a intentarlo? ¿O hay una mejor manera?

¿Se liberan los bloqueos de la base de datos cuando una actividad se detiene/se destruye? De ser así, ¿podría crear un bloqueo sincronizado contra el proveedor de contenido?

Respuesta

-4

Si está utilizando un ContentProvider, creo que no le importa cuántos hilos están leyendo/escribiendo: la plataforma Android maneja todas sus llamadas en un solo hilo y selecciona la sincronización y el bloqueo. Usted acaba de abrir su base de datos y leer/escribir en ella, y todos los demás hablan a través de la interfaz ContentProvider.

+5

Documentaciones de Android "Debido a que estos métodos ContentProvider pueden invocarse desde varios objetos ContentResolver en diferentes procesos y subprocesos, deben implementarse de manera segura para hilos". – kakopappa

+1

Esto es incorrecto. La plataforma Android no hace tal cosa. –

+0

Hm, reputaion 50.5k y tal respuesta? –

1

¡Vaya! Perdí la cookie de usuario no registrada, por lo que no puedo votar correctamente la respuesta de Femi.

La documentación http://developer.android.com/guide/topics/providers/content-providers.html confirma esto con "Cuando se inicia una consulta, el sistema Android identifica el proveedor de contenido que es el objetivo de la consulta y se asegura de que está en funcionamiento El sistema crea la instancia de todos los objetos ContentProvider;. Que nunca necesita hacerlo por su cuenta. De hecho, nunca trata directamente con los objetos de ContentProvider. Por lo general, solo hay una instancia única de cada tipo de ContentProvider, pero puede comunicarse con múltiples objetos ContentResolver en diferentes aplicaciones y procesos. entre procesos es manejado por las clases ContentResolver y ContentProvider. "

+1

Si marca su pregunta/respuesta para la atención del moderador y selecciona otra, puede solicitar que las dos cuentas se fusionen. También es posible que desee considerar el registro :) – forsvarir

3

Si trabaja directamente con bases de datos y tiene varios escritores de differen Puede encontrar problemas con la concurrencia.

Se puede acceder al ContentProvider desde varios programas al mismo tiempo, por lo tanto, debe implementar el acceso seguro para subprocesos. La forma más fácil es usar la palabra clave synchronized frente a todos los métodos del ContentProvider, de modo que solo un hilo pueda acceder a estos métodos al mismo tiempo.

Si usted no requiere que Android sincroniza el acceso a los datos de la ContentProvider, establezca el atributo android:multiprocess=true en su definición <provider> en el archivo AndroidManifest.xml. Esto permite que se cree una instancia del proveedor en cada proceso del cliente, eliminando la necesidad de realizar una comunicación entre procesos (IPC).

+1

Sí lo hace: http://docs.oracle.com/javase/tutorial/essential/concurrency/syncmeth.html –

+0

No lo entiendo, así que si no configuro multiprocess = true android sincronizará todos los accesos al ContentProvider? En este caso, no sería necesario utilizar la palabra clave sincronizada, ¿verdad? En este caso, la respuesta de Femi es correcta? – Gus