Android开发者请进,帮忙解决------------Android短信批量速度的优化

在做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对并发情况支持的不是很好;

经过我的实际测试,发现当数据库里原来的数据不多时,统一事务的方法批量插入消耗的时间还是蛮少的,但随着数据越来越多,就会越来越慢了~~~更好的实现方法自己再慢慢摸索吧,上面的尝试也算学习了吧。。。。

时间: 2024-11-08 11:30:03

Android开发者请进,帮忙解决------------Android短信批量速度的优化的相关文章

[Android开发那点破事]解决android.os.NetworkOnMainThreadException

[Android开发那点破事]解决android.os.NetworkOnMainThreadException 昨天和女朋友换了手机,我的iPhone 4S 换了她得三星I9003.第一感觉就是好卡,果断刷机.以前是Android 2.3的系统.回来刷成了4.4. 好了,问题来了.在我用手机测试我们的APP的时候,抛出一个如题的异常:android.os.NetworkOnMainThreadException 第一次看到这异常,字面意思是说:在主线程中的网络异常.然后我就去了解了下这个异常,

Android基础入门教程——10.2 SmsManager(短信管理器)

Android基础入门教程--10.2 SmsManager(短信管理器) 标签(空格分隔): Android基础入门教程 本节引言: 本节带来的是Android中的SmsManager(短息管理器),见名知意,就是用来管理手机短信的, 而该类的应用场景并不多,一般是我们发短信的时候才会用到这个API,当然这种短信是 文字短信,对于彩信过于复杂,而且在QQ微信各种社交APP横行的年代,你会去发1块钱一条的 彩信吗?所以本节我们只讨论发送普通文字短信! 官方文档:SmsManager 1.调用系统

(转)创建DB2实例时出错,请大家帮忙解决

创建DB2实例时出错,请大家帮忙解决 原文:http://bbs.chinaunix.net/thread-3601748-1-1.html 运行:$DB2DIR/instance/db2icrt  -u db2fadm1 db2inst1 出现错误:            Program name = db2idbmInstance home dir = /db2inst1,   Sysadm group = db2iadm1Instance type = 1,  Auth type = SE

解决:短信添加录音附件,录音,没有录音时间限制,超出彩信最大限制也正常录音

[测试步骤] 短信添加录音附件,录音 [测试结果] 没有录音时间限制,超出彩信最大限制也正常录音 [预期结果] 应该有录音时间限制 首先分析是否因在彩信中没有没有在Intent中封装彩信剩余大小,定位到ComposeMessageActivity类的addAttachment()方法中: private void addAttachment(int type, boolean replace) { // Calculate the size of the current slide if we'

解决新建短信时,输入“+86”,然后输入联系人名字“1”,按删除键之后,联系人变为“1”,删除操作为达到预期结果

1.保存一个"+8618621058121"号码的联系人"Jane" 2.保存一个号码是"42266888"的联系人"1" 3.信息-新建信息-在联系人输入框中输入"+86"-输入"1"-点击删除按钮 [测试结果]联系人变为1 [预期结果]联系人应为"Jane" 与问题相关的类为Mms下的ComposeMessageActivity,相关控件为在initRecipie

EXCEL工资条短信批量发送方法

每个月工资条如何发放给大家是一个头疼的事情,因为工资涉及到保密问题,人一多就特别容易出错:光这个发工资条就够让人忙活好长时间的了:现在跟大家分享一下EXCEL 批量发送发送工资条! 短信发送财务可将表格导入到云信通-企业信使信息批量快速地发送到员工手机上,一键搞定 简易性:"企业信使"系统采用图形化界面,设计人性化,简单易用 保密性:企业信使短信点对点,保证每个人,只能收到属于自己的工资条短信 智能性:自定义工资条模板,自定义长短信发送方式,支持用户自己添加或删除项目等 便捷性:员工可

苹果相册短信批量推广设备

苹果相册短信批量推广设备[电薇:132乄8688乄4109][Q群780516296]直击|智博会签约重大项目501个 合计投资6120亿美国中期选举前 脸书推特风声鹤唳忙删可疑账号士气高涨!利物浦不休息备战 不想犯曼联的错误国家围棋队选拔赛青年组名次 陈正勋得第一名曝欧足联将新增第三级别欧战 2021年32队参战上港发布客战华夏海报:开题!盼攻克接下每道难题隔夜要闻:标普纳指再创新高 原油创8月最高收盘价自带流量的普京又登热搜 这次是因为一件休闲夹克小伙被烫伤致死:家属怒吼儿子不该死 公司称意

苹果日历短信批量推广设备

苹果日历短信批量推广设备[电薇:132乄8688乄4109][Q群780516296]金山杯-刘轶恒进球王博文点杀 中国U15红队2-1印度设新部门.储备金锭 委内瑞拉推新举措应对经济危机三大运营商5G频谱划分初定 联通电信抢得"C位"外媒:空气污染致人类平均寿命缩短超过一年美联储主席鲍威尔为逐步加息辩护 称有利于经济大雨挡不住热情!哈马高能兔子正式亮相!越南海警筹建航空兵:执法船能载直升机 火力也更强徐嘉余:理性追星不影响训练 目标奥运最高领奖台欧冠小组出线赔率:6队无悬念 死亡之组

苹果提醒短信批量推广设备

苹果提醒短信批量推广设备[电薇:132乄8688乄4109][Q群780516296]印日将首次举办联合军演 英媒:似乎是为对抗中国亚运射击中国又获1金 女子飞碟双多向包揽前两名科学家实现A型B型血变O型 归功于一种神奇的酶被处分后不警醒 吉林四平原副市长一审被判10年中方否认参与叙军事行动报道:媒体曲解北京政策美国想让日本买F22与F35杂交新战机 单价达2亿美元活过100岁值得庆贺 但长寿对日本来说却已成负担山东洪灾畜禽无害化处理基本完成:处理厂全天运营美媒:中国海军2030年或赶超美军 将