分析原因:新建彩信草稿,保存后,再打开草稿,修改收件人,再保存会产生新的threadId, 而之前保存的草稿theadId还存在,导致此问题。

(必现。 解决方法:将原来的Thread_id和新的收件人传递到Provider,对收件人进行更新,避免生成新的Thread)

MMS草稿保存

private void asyncUpdateDraftMmsMessage(final Conversation conv, final boolean isStopping) {
if (Log.isLoggable(LogTag.APP, Log.VERBOSE)) {
LogTag.debug("asyncUpdateDraftMmsMessage conv=%s mMessageUri=%s", conv, mMessageUri);
}
final HashMap<Uri, InputStream> preOpenedFiles =
mSlideshow.openPartFiles(mContentResolver); new Thread(new Runnable() {
@Override
public void run() {
try {
DraftCache.getInstance().setSavingDraft(true); final PduPersister persister = PduPersister.getPduPersister(mActivity);
final SendReq sendReq = makeSendReq(conv, mSubject);
persister.setMmsDraftThreadId(mOldMmsDraftThreadId);//add by antoon, send old thread_id to pdu if (mMessageUri == null) {
mMessageUri = createDraftMmsMessage(persister, sendReq, mSlideshow, null,
mActivity, preOpenedFiles);//对于MMS保存,thread_id会在pdu保存时创建
} else {
updateDraftMmsMessage(mMessageUri, persister, mSlideshow, sendReq,
preOpenedFiles);//修改之前保存的MMS后,pdu更新数据,这里会根据收件人getOrCreateThreadId,所以修改收件人会导致创建新的thread
}
ensureThreadIdIfNeeded(conv, isStopping);//这里确认thread_id创建或获取成功,否则再次执行getOrCreateThreadId
conv.setDraftState(true);
if (Log.isLoggable(LogTag.APP, Log.VERBOSE)) {
LogTag.debug("asyncUpdateDraftMmsMessage conv: " + conv +
" uri: " + mMessageUri);
} // Be paranoid and delete any SMS drafts that might be lying around. Must do
// this after ensureThreadId so conv has the correct thread id.
asyncDeleteDraftSmsMessage(conv);
} finally {
DraftCache.getInstance().setSavingDraft(false);
closePreOpenedFiles(preOpenedFiles);
}
}
}, "WorkingMessage.asyncUpdateDraftMmsMessage").start();
}

看看  ensureThreadIdIfNeeded(conv, isStopping)

private void ensureThreadIdIfNeeded(final Conversation conv, final boolean isStopping) {
if (isStopping && conv.getMessageCount() == 0) {
// We need to save the drafts in an unorphaned thread id. When the user goes
// back to ConversationList while we're saving a draft from CMA's.onStop,
// ConversationList will delete all threads from the thread table that
// don't have associated sms or pdu entries. In case our thread got deleted,
// well call clearThreadId() so ensureThreadId will query the db for the new
// thread.
conv.clearThreadId(); // force us to get the updated thread id
}
if (!conv.getRecipients().isEmpty()) {
conv.ensureThreadId();
}
}
public synchronized void clearThreadId() {
// remove ourself from the cache
if (Log.isLoggable(LogTag.APP, Log.VERBOSE)) {
LogTag.debug("clearThreadId old threadId was: " + mThreadId + " now zero");
}
Cache.remove(mThreadId); mThreadId = 0;
} public synchronized long ensureThreadId() {
if (DEBUG || DELETEDEBUG) {
LogTag.debug("ensureThreadId before: " + mThreadId);
}
if (mThreadId <= 0) {
if (mIsGroupChat && mGroupChat != null) {
HashSet<String> numbers = new HashSet<String>();
numbers.add(String.valueOf(mGroupChat.getThreadId()));
ContactList groupRecip = ContactList.getByNumbers(numbers, false);
mThreadId = getOrCreateThreadId(mContext, groupRecip, mIsGroupChat);
} else {
mThreadId = getOrCreateThreadId(mContext, mRecipients, mIsGroupChat);
}
}
if (DEBUG || DELETEDEBUG) {
LogTag.debug("ensureThreadId after: " + mThreadId);
} return mThreadId;
}

对于MMS, SMS草稿保存时都会调用 ensureThreadIdIfNeeded  , 如果修改了收件人,应该都会有thread_id重建,获取操作。

但是对于SMS却没有反馈此问题,是怎么回事呢?

——原因:sms草稿会在重新打开时,将数据库删掉。重新保存草稿时,重新插入数据。 而MMS草稿在重新打开时,不会将数据库删除,修改收件人后,重新创建thread,导致此Bug。

但sms草稿的处理方式,重新打开sms草稿,即使不修改,再次保存时,也会重新创建数据库数据。

新建MMS草稿保存后,再进入草稿修改收件人,退出到会话界面,会显示两条草稿的更多相关文章

  1. 在用easyui中做CRUD功能时,当删除一行或多行数据后再点击修改会提示你选中了多行,如何解决这个bug了?

    在用easyui中做CRUD功能时,当删除一行或多行数据后再点击修改会提示你选中了多行,如何解决这个bug了? 在删除成功后,加上这句话就可以了:$("#dg").datagrid ...

  2. Mybase解决保存文件后再打开不能修改编辑

    1.问题复现 2.解决方式 3.可以修改编辑

  3. hibernate中保存一个对象后再设置此对象的属性为什么不需要调用update方法了

    hibernate中保存一个对象后再设置此对象的属性为什么不需要调用update方法了 例如session.save(user);user.setAge(20); 原因: hibernate对象的三种 ...

  4. EF5修改edmx表结构保存后不自动更新tt (转)

    http://blog.csdn.net/panderman/article/details/8172968 不知道这算不算一个bug,当你新建一个从数据库生成的edmx时,他能正确的生成所有的tt文 ...

  5. MVC导出数据到EXCEL新方法:将视图或分部视图转换为HTML后再直接返回FileResult

    导出EXCEL方法总结 MVC导出数据到EXCEL的方法有很多种,常见的是: 1.采用EXCEL COM组件来动态生成XLS文件并保存到服务器上,然后转到该文件存放路径即可: 优点:可设置丰富的EXC ...

  6. Web安全--使用Salt + Hash将密码加密后再存储进数据库

    转载原地址 http://www.bozhiyue.com/mianshiti/_net/2016/0728/314239.html (一) 为什么要用哈希函数来加密密码 如果你需要保存密码(比如网站 ...

  7. PS切图保存后的背景图为透明

    1.若想PS切图保存后的背景图为透明,那么则需要在如下图中所示的修改即可,切图后[文件]——>[存储为web格式]——>[PNG-24]: 2.要想在css中的背景图片为相通,则先剪切一个 ...

  8. 工作总结 1 sql写法 insert into select from 2 vs中 obj文件和bin文件 3 npoi 模板copy CopySheet 最好先全部Copy完后 再根据生成sheet写数据 4 sheet.CopyRow(rowsindex, rowsindex + x); 5 npoi 复制模板如果出现单元格显示问题

    我们可以从一个表中复制所有的列插入到另一个已存在的表中: INSERT INTO table2SELECT * FROM table1; 或者我们可以只复制希望的列插入到另一个已存在的表中: INSE ...

  9. 个人学习记录1:二维数组保存到cookie后再读取

    二维数组保存到cookie后再读取 var heartsArray = [[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0],[0,0, ...

随机推荐

  1. Navicat(服务器对象) -2之MySQL 或 MariaDB 对象

    MySQL 或 MariaDB 对象 http://www.navicat.com.cn/manual/online_manual/cn/navicat/win_manual/index.html 要 ...

  2. SQL Server 2008 数据库通过镜像同步备份(数据库热备)

    数据库镜像运行模式: 异步数据库镜像模式(异步,高性能模式) 同步数据库镜像模式(同步,高安全模式) 参考资料: http://technet.microsoft.com/zh-cn/library/ ...

  3. Logistic Regression逻辑回归

    参考自: http://blog.sina.com.cn/s/blog_74cf26810100ypzf.html http://blog.sina.com.cn/s/blog_64ecfc2f010 ...

  4. ORM框架

    半自动:iBATIS是一个半自动化的ORM框架,需要通过配置方式指定映射SQL语句 全自:由框架本身生成(如Hibernate自动生成对应SQL来持久化对象),即Hibernate属于全自动ORM框架 ...

  5. APP测试点总结

    1.功能性测试: ——根据产品需求文档编写测试用例. ——软件设计文档编写用例. 注意:就是根据产品需求文档编写测试用例而进行测试.2.兼容性测试: ——android版本的兼容性 ——手机分辨率兼容 ...

  6. css兼容问题集合

    css兼容问题 兼容问题 1.文字本身的大小不兼容.同样是font-size:14px的宋体文字,在不同浏览器下占的空间是不一样的,ie下实际占高16px,下留白3px,ff下实际占高17px,上留白 ...

  7. 上传图片HTML <form> 标签的 method 属性

    <!DOCTYPE HTML><html><body> <form action="/example/html5/demo_form.asp&quo ...

  8. oracle 做算法 数据为空时,默认为0

    SELECT NVL('',0) FROM DUAL 获取当前日期: SELECT SYSDATE FROM DUAL 当前日期-某个日期差的天数 SELECT  TO_NUMBER(SYSDATE  ...

  9. 邮件江湖群狼环伺 U-Mail邮件系统防狼有术

    小时候听过一首儿歌<小兔子乖乖>,里面说到有条恶狼,常常冒充小兔子的“妈妈”,要求小兔 子开门,但小兔子谨守妈妈的训诫,就是不开门,直到辨别出妈妈在窗外的声音,才打开房门.如果我们将一些似 ...

  10. DIOCP之DEMO学习顺序及达到要求

    第一个:ECHO,了解基础网络通讯过程也触发事件 第二个:StringDEMO,理解长字符串发送编码过程 第三个:StreamCoderDEMO,理解粘包的理方式,即数据类型+数据长度+数据流 第四个 ...