请各位帮忙解决----Android短信批量速度的优化问题
来源:互联网 发布:醉玲珑小说网络点击量 编辑:程序博客网 时间:2024/06/05 15:16
在做Android上短信的备份还原功能时,短信的恢复思路最初考虑的很简单,循环解析文件,每得到一条短信,就调用SMSProvider的insert方法将短信插入数据库,SMSProvider是短信数据库操作的最基本的类,重载了父类ContentProvider的query,insert,delete和update方法,除了insert方法,父类ContentProvider中还有个bulkInsert方法,该方法为批量插入,代码如下:
<span style="font-size:14px;">public int bulkInsert(Uri uri, ContentValues[] values) { int numValues = values.length; for (int i = 0; i < numValues; i++) { insert(uri, values[i]); } return numValues; }</span>
可以看出来,该函数只是简单的循环调用了insert方法,而insert是虚方法,所以真正在使用时会调用到SMSProvider的insert方法,并没有速度上的优势;
在实际使用过程中,要恢复的短信数量多时,速度有点无法忍受,决定考虑下对速度的优化;
Android数据库使用精巧的Sqlite3,幸运的是Sqlite3是支持事务的,自然就想到了统一事务对批量插入带来的好处,这是尝试速度优化的第一个方向,
<span style="font-size:14px;">db.beginTransaction(); try { //Here数据库操作 db.setTransactionSuccessful(); //别忘了这句 } catch (xxx) { //XXXXX} finaly { db.endTransaction(); //Commit}</span>
带来了其他风险,对于短信这个应用是不被允许的。
……………………………………………………………………………………………………………………………………………………………………
这是很早之前写的,目前尝试失败了,写出原因:
上面也提到了bulkInsert这个函数,他里面并没有使用统一事务的方法来将短信批量插入,而是循环调用insert,并没有什么速度上的优势与考虑,我想Android的开发人员们,不可能不知道Sqlite3统一事务的方法,那他们为什么放着不用呢??
原因是如果使用统一事务会带来另外一个风险--丢失收到的短信;事务的开启是要锁定DB的,也就是说开启一个事务之后,其他对数据库的写入操作都是无法成功的,这样的话,如果在一次统一事务里操作的数据很多,需要消耗一定的时间,那么短信到来时,其是无法被insert到数据库里的,也就收不到这条短信了,与短信恢复这个操作速度慢来比,这更加不能被允许;另外一个风险就是死锁,说到底是因为Sqlite3对并发情况支持的不是很好;
经过我的实际测试,发现当数据库里原来的数据不多时,统一事务的方法批量插入消耗的时间还是蛮少的,但随着数据越来越多,就会越来越慢了~~~更好的实现方法自己再慢慢摸索吧,上面的尝试也算学习了吧。。。。
- 请各位帮忙解决----Android短信批量速度的优化问题
- 刚学VB,请各位帮忙解决小问题!
- 请各位帮忙看看这个内存泄漏问题,该如何解决?BSTR
- 请各位高手帮忙!
- 各位同仁,我在设计图形编辑器的时候,遇到些问题,请帮忙出出注意!
- 请各位大佬帮忙,本人遇到一个SQL语句的问题
- 空间满问题,请各位高手帮忙啊!
- 罕见的编码转换问题(请高手帮忙解决)
- 各位高手大师请帮忙
- hidden的问题,各位高手,帮忙啊!!!
- 我有个小问题,请大家帮忙解决
- 才学SQL,请各位大侠帮忙!
- C#加密解密,请各位帮忙!
- 请各位大侠帮忙解决一下,试过各种方法都不行
- framebuffer中的一些问题,各位大侠帮忙帮忙解决,谢谢啊!
- 各位大声求帮忙,C语言代码,请帮忙修改
- 没解决的问题,如果你看到了请帮忙解答下好吗?
- 怎样自定义文件格式,并用自己的程序打开,遇到问题请高手帮忙解决
- CSS常用代码使用技巧大全
- 添加启动游戏过渡场景Default Splash Scene(Unity3D开发之十三)
- Log4j 日志配置示例详解
- 说说IT界加班文化
- 4.15、内部函数和外部函数
- 请各位帮忙解决----Android短信批量速度的优化问题
- VS2012添加单元测试
- 【J2SE快速进阶】——多线程之synchronized
- easy-layout
- HTML中ID与Name的命名规范
- sax解析并封装XML到bean
- java中类的构造方法与默认构造方法的关系
- Hi3516A linux kernel 编译步骤详细说明
- 干嘛不去掉“I”和“Impl”?