android - Android 内容提供程序中来自多个进程的多次写入

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

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

最佳答案

A ContentProvider是一个 list 声明的组件,它由操作系统实例化并绑定(bind)到主进程(除非属性 process 被不同地指定)。因此,在该应用程序进程的生命周期内,只会创建已声明的 ContentProvider 的单个实例。其他希望与之交互的进程必须通过 ContentResolver这反过来只是与创建的单个提供者通信。

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

总而言之,content provider 对于多进程和多线程交互是安全的,因为:

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

关于android - Android 内容提供程序中来自多个进程的多次写入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57029749/

相关文章:

java - 如何创建一个四位数的密码 Android 布局

android - 为 API 请求动态添加可选参数

android - 验证备份 ZIP 文件

angular - 尝试运行 android app sqlite DB 时出错

android - 如何管理 Android 项目的免费和付费版本?

android - SQLite 跨表跨列排序

java - Android 系统覆盖窗口

android - 安装ChildBrowser 5.0.0

android - EditText中的多种语言,不带特殊字符

SQLite - 外键比 int 列更有效吗?