【问题标题】:Android: ContentProvider Request in AsyncTask get delayed when some other ContentProvider operations/sqlite writes are happeningAndroid:当发生其他一些 ContentProvider 操作/sqlite 写入时,AsyncTask 中的 ContentProvider 请求会延迟
【发布时间】:2015-08-02 10:23:02
【问题描述】:

我在 AsyncTask 中有一个 ContentProvider 访问权限,通常可以在手机上查找存储在 sqlite 中的一些数据时正常工作。

不过,我还有一些其他后台服务可以进行网络检查以及下载和更新一些数据。

观察到这个网络相关的后台活动正在影响我的 ContentProvider。完全处理离线数据的 ContentProvider 要么延迟响应,要么长时间不返回。

那么 ContentProvider 或 sqlite 数据库上是否有任何锁定/排队机制?写入不会发生在与读取相同的表上。

【问题讨论】:

标签: android database sqlite android-asynctask android-contentprovider


【解决方案1】:

那么 ContentProvider 或 sqlite 数据库上是否有任何锁定/排队机制?写入不会发生在与读取相同的表上。

  1. ContentProvider 实现需要额外的同步才能实现线程安全,即开发人员负责它

  2. SQLite 已同步,即写入排除读取

在您的情况下,您可能希望启用write-ahead-logging (WAL),api 11+。这使得写入可以在单独的日志中并行发生:不再需要持有锁并排除并行读取。

例如:

SQLite, Content Providers, & Thread Safety

Official docs for SQLite locking

Good explanation of WAL

【讨论】:

  • 您对这方面的最佳实践有什么想法吗?我想显示 UI 反馈是显而易见的。 WAL 并不总是保证事情是并行工作的。
  • Google 建议使用 Loaders 访问 CP,这很方便在更改后自动重新加载内容。 (使用 setNotifyUri()/notifyChange())。不过,这将是“过于自动”,因此显示进度动画将变得比应有的困难。对于 SQLite 数据库,通常在 CP 中包装一个单例就足够了。在这种情况下也不需要关闭数据库。如果 WAL 在性能方面还不够,我不知道你还能做什么,除了重组你的应用程序以避免锁争用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多