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)
Android组件体系之ContentProvider使用注意事项的更多相关文章
- Android组件体系之Activity启动模式解析
本文主要分析Activity的启动模式及使用场景. 一.Activity启动模式浅析 1.standard 标准模式,系统默认的启动模式.在启动Activity时,系统总是创建一个新的Activity ...
- Android组件体系之视图绘制
一.View组件View组件有几个重要的方法需要关注,也是自定义View经常需要重写的方法. 1.measure作用是测量View组件的尺寸.对应的方法是onMeasure,测量View的宽和高.Vi ...
- Android组件体系之BroadcastReceiver小结
1.常见分类 BroadCastReceiver,按注册方式可以分为静态广播接收器和动态广播接收器. 静态广播接收器:不受程序是否启动的约束,当应用程序关闭之后,还是可以接收到广播(一般广 ...
- Android组件体系之Service解析
一.调用方式 1.启动服务 只启动一个服务,不进行通信,包括startService.startForegroundService两种调用方式.第二种方式适用于后台应用启动前台服务,在启动 ...
- Android组件之自定义ContentProvider
Android的数据存储有五种方式Shared Preferences.网络存储.文件存储.外储存储.SQLite,一般这些存储都只是在单独的一个应用程序之中达到一个数据的共享,有时候我们需要操作其他 ...
- Android 组件ContentProvider
Android 组件ContentProvider Android的数据存储有五种方式Shared Preferences.网络存储.文件存储.外储存储.SQLite,一般这些存储都仅仅是在单独的一个 ...
- Android 四大组件学习之ContentProvider二
上节学习了什么是ContentProvider.以及ContentProvider的作用.以及什么是URL.本节就对上节学习的知识做一个实践,也就是定义自己的ContentProvider 好.实践是 ...
- 【Android开发精要笔记】Android组件模型解析
Android组件模型解析 Android中的Mashup 将应用切分成不同类别的组件,通过统一的定位模型和接口标准将他们整合在一起,来共同完成某项任务.在Android的Mashup模式下,每个组件 ...
- Android 这 13 道 ContentProvider 面试题,你都会了吗?
前言 作为 Android 的四大组件之一,ContentProvider 可以说是无处不在了. 但是对于我而言,开发过程中看似 ContentProvider 用得很娴熟,却一直没能形成一个完整的体 ...
随机推荐
- PHP页面跳转三种实现方法
一.header()函数 header()函数是PHP中进行页面跳转的一种十分简单的方法.header()函数的主要功能是将HTTP协议标头(header)输出到浏览器.header()函数的定义如下 ...
- exc_bad_instruction(code=EXC_I386_INVOP,subcode=0x0) 错误
对象存储异常 对象存储要遵守NSCoding协议 #import "EmotionModel.h" @interface EmotionModel()<NSCoding> ...
- php踩过的那些坑(2) strpos引发的血案
一.前方有坑 php某些自带函数,如果使用不当,也会坑得你人仰马翻.比如:strpos() 先了解一下strpos()函数是干啥的. strpos — 查找字符串首次出现的位置 用法: int str ...
- P1387 最大正方形 |动态规划
题目描述 在一个n*m的只包含0和1的矩阵里找出一个不包含0的最大正方形,输出边长. 输入格式 输入文件第一行为两个整数n,m(1<=n,m<=100),接下来n行,每行m个数字,用空格隔 ...
- HDU5343 MZL's Circle Zhou(SAM+记忆化搜索)
Problem Description MZL's Circle Zhou is good at solving some counting problems. One day, he comes u ...
- cmd 窗口中运行 Java 程序
1.CMD 命令提示符(Command Processor)(CMD) CMD命令:开始->运行->键入 cmd(在命令行里可以看到系统版本.文件系统版本) 2.对文件夹操作的部分命令 启 ...
- Nginx的事件循环
首先事件循环的起点就是监听端口获取连接,我们可以在ngx_event_core_module模块的ngx_event_process_init函数中看到如下的代码: /* for each liste ...
- 【Web技术】334- yarn、npm、cnpm 三者如何优雅的在一起使用 ?
前端得包管理你有过几个? 一位用不好包管理器的前端,是一个入门级前端,一个用不好webpack的前端,是一个初级前端 三个包管理器是可以一起用的,只要你够胆大心细,就没任何问题! 在javeScrip ...
- 垂直方向margin重叠原因与解决方法
参考博客:https://blog.csdn.net/weixin_33743661/article/details/88755435
- 【Zuul】使用学习
[Zuul]使用学习 添加依赖 <dependency> <groupId>org.springframework.cloud</groupId> <arti ...