1、数据访问机制

客户端/调用者通过getContentResolver调用,由ActivityThread、AMS获取到ContentProvider的代理,再通过这个代理对象调用服务端的实现(也即派生类中的自定义方法)。在自定义的ContentProvider中,对数据库的操作是通过SQLiteDatabase类完成的。

2、多线程并发

如果ContentProvider的数据存储方式是使用一个SQLite数据库,则不需要同步保护,因为SQLite内部实现好了线程同步,若是使用了多个SQLite数据库则需要同步保护,因为SQL对象之间无法进行线程同步。

如果ContentProvider的数据存储方式是内存,则需要自己实现线程同步,例如添加synchronized关键字。

3、 批量处理与性能优化

如果只是批量增加数据,可以使用bulkInsert方法。这里需要注意该方法最终是通过循环调用ContentProvider.insert方法,实际上调用了用户自定义的ContentProvider派生类中重写的insert,由于该方法会在短时间内被循环调用。

在重写bulkInsert方法时,注意有无notifyChange或者其它可能影响性能的操作。        Android原生代码中,MediaProvider的做法是,专门定义了一个insertInternal用于内部使用,该方法不会调用notifyChange,而是由调用方例如bulkInsert在批处理全部完成后再通知。

对于批量删除/更新也就是UPDATE、DELETE操作,可以使用ContentProviderOperation结合ContentProvider.applyBatch方法。

4、其他补充

ContentProvider的onCreate函数中,不要做耗时操作,因为其生命周期函数是在主线程的调用的。

数据量很小的时候,例如1MB以下,不建议直接使用系统的增删改查函数,因为该组件的跨进程数据传输是基于mmap的匿名共享内存机制,这种情况下可以调用其call方法,降低开销。

注意访问权限的限制与合法性的校验,合理使用setPathPermissions方法。

另外,如果ContentProvider所在进程被杀,使用该ContentProvider的进程也会被杀,这部分的处理是在ActivityManagerService中执行的。

(相关完整且成体系的文章,可参见本人原创的开源电子书《Android系统与性能优化》,地址:https://github.com/carylake/androidnotes)

最新文章

  1. C语言 · 4-3水仙花数
  2. fineui刷新父页面
  3. 【转】Java并发编程:Lock
  4. Android:Butter Knife 8.0.1配置
  5. c#入门笔记(1)数据类型
  6. 如何管理linux开机自启服务
  7. Rhel6-piranha配置文档
  8. 转: Red Hat/Fedora Linux 上使用 yum 安装 python pip 模块
  9. 支持4G以上文件的MD5单元
  10. C#处理Json文件
  11. BZOJ 1588 营业额统计 Splay
  12. Android Game
  13. laravel实现发送qq邮件
  14. NOI2011 兔农
  15. 工作经常使用的SQL整理,实战篇(一)
  16. SVN分支的创建,合并,与销毁和相关操作
  17. 对不可描述的软件安装sfbo插件
  18. Benelux Algorithm Programming Contest 2017(D)
  19. Java发送邮件时标题和发件人乱码
  20. js数组,字符串,json互相转换函数有哪些

热门文章

  1. 教你如何关闭IIS服务
  2. ajax规范写法
  3. NFS服务部署
  4. 使用Jq实现弹出层
  5. pom父工程dependencyManagement中的jar包在子工程中不写版本号无法引入的问题
  6. 转:Maven的默认中央仓库以及修改默认仓库&配置第三方jar包从私服下载
  7. CentOS 6 编译 TensorFlow for Java 以及 Maven Pom
  8. 拓展KMP分析
  9. 基于iCamera测试高清摄像头OV7725小结
  10. 静态页面开发JS页面跳转加密解密URL和参数