|
本帖最后由 moo.tinys 于 2011-12-9 10:34 编辑
4 ], r- u5 U/ w7 a6 I0 _' n4 P/ O9 M/ Y- D/ g+ A7 P+ M* }9 H
背景知识: 来自 Accounts 同步过来的联系人的叫 Contact, 自动 link (包括1的情况)成 Person
% d0 J% m2 U3 [背景知识2: edit 修改 contact, 查看是 person
. ^% `/ U8 E! F# C& z! G可能有关的条件: 使用 1.4G 特殊内核后(也可能无关)
/ N9 p8 w/ F. I; y0 \. d操作: 编辑联系人点done后, 展开 contacts2 Q" t( R& x0 y" I
错误现象:
& Z* M1 f+ q3 `' s% X6 d& r 1. 修改后 person 信息是修改后的, 点 app.contacts 的 Person 详细资料的顶部展开 contact, contact 信息是修改前的 (一般不展开, 所以此现象比较少留意到)' \4 Q5 V9 V1 Y6 L
2. 接着点击 edit 进行再修改, 看到的是老的 contact 信息 (现象很明显, 来回修改就会发现)+ R8 W/ [0 ^" t2 T$ O
分析原因:3 A' o5 Y; [! o3 D
a. 修改后, 系统先保存 person 后保存 contacts7 u% i7 l5 W7 s+ O1 v
b. person 的 detail view (查看详细资料) 界面在 watch person 数据库, 一旦修改就触发脚本执行 reloadContacts 重新载入 联系人, 此时 contacts 尚未被写入
+ J2 p }: p% ~% r \2 N) y: K* V8 ]9 l# K' g& U
其他罗嗦话: 以上确实从代码逻辑上分析出问题了. 而为何以前用 2.1.2 没发现, 为何模拟器里的 2.1.0 没这个问题, 这些疑问尚未深入研究, 也不打算研究. 至少原因相关的代码并没有被补丁修改过, 甚至这部分代码 2.1.2 跟 2.1.0 是一样的. 只能怀疑是这里的确是 Race condition (竞争条件)说不定谁先谁后, 所以随即概率出问题. watch 跟 cpu 速度的变化暴露了这个问题. 保存 person/contacts 的过程是多个 Future.then 操作, Future 之间 db watch 事件可能先触发 (未深入分析 Future/dbwatch 的机制, 猜测应该是如此)
8 i6 t; F0 f' [! T4 F因此即使没用超频内核, 也有一定概率出现, 因此修复后可更稳定0 `5 c. F; e$ D0 v
% Q2 j, G4 u" s# |$ t2 Z
补丁研发中 |
|