Android Content provider中来自多个进程的多次写入

时间:2019-07-14 17:45:17

标签: android sqlite android-sqlite android-contentprovider android-room

我知道Android的ContentProvider可以从多进程/多线程进行多次写入而不会引发锁定异常。在多线程环境中,它可能已使用读写锁同步了该方法。但是关于将创建多个对象的多进程呢?任何人都可以让我进行ContenProvider的内部工作吗。

1 个答案:

答案 0 :(得分:0)

ContentProvider是清单式声明的组件,它由OS实例化并绑定到主进程(除非属性process的指定不同)。因此,在该应用程序进程的生存期内,仅创建一个声明的ContentProvider的单个实例。希望与之交互的其他过程必须经过ContentResolver,而该Binders仅与创建的那个提供者进行通信。

请注意,当从另一个进程中使用提供程序时,它正在通过IPC(特别是通过AssetFileDescriptor)进行通信,这意味着将在IPC调用期间在BinderThread中调用提供程序的方法。有一个绑定线程线程池,以便可以与多个应用程序进行一些并发通信,这意味着应该进行适当的同步。

总而言之,内容提供者对于多进程和多线程交互是安全的,因为:

  1. 他们是单身人士。
  2. 开发人员通过共享状态的适当同步来保证多线程安全。
  3. ContentProvider保证多进程安全。
  4. ContentProvider的定义具有适合IPC交互的返回类型。 (它们是可打包的,例如SQLiteCursor,或者它们是ashmem,由使用binding redirect的已分配共享内存支持)。