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