Android加载通话记录流程分析

时间 2014-04-05 15:20:21   CSDN博客 原文   http://blog.csdn.net/fx1ts/article/details/22986221 主题  Android  数据库

通话记录的加载过程和大部分的应用类似,也是异步查询数据库,得到查询结果后再刷新 ListView 。但是在加载通话记录时还有一些特别的处理。特别是在绑定Listview 时涉及到了一些复杂的操作。

显示通话记录由 CallLogFragment.java 文件进行处理。在加载通话记录的过程中还用到了 CallLogQueryHandler 查询通话记录数据库, CallLogAdapter 填充 ListView 。

查询通话记录的过程大致如下:

       

其中 CallLogQueryHandler 继承自 CursorQueryHandler ,该类是执行异步数据库查询的常用类。以上过程非常的常见,大部分程序都和该流程类似。

关键是在 CallLogAdapter  的 bindView 函数中执行了很多难以理解的操作。通过查看通话记录的显示内容知道,在通话记录中显示了拨打电话的号码,通话记录的类型,该号码所对应的联系人(如果号码已加入联系人)等。当挂断电话时会查询联系人数据库查找所拨打的电话对应的联系人姓名,并把这些信息写入通话记录数据库中。因此在通话记录的数据库中有一列用于存储联系人姓名。但是通话记录中的联系人名称和联系人数据库中的名称有时候是不一致的,通话记录中的联系人名称只是一个缓存。考虑这样一种情况:当和张三打完电话后,立刻把联系人中的张三改为张三三,然后查看通话记录会发现通话记录也会变成张三三,而通话记录数据库中仍然是张三。

为了使通话记录中的显示名称和联系人中的一致,在显示通话记录时,需要查询每个电话号码对应的联系人信息。为了提高效率,在 CallLogAdapter  中用CallLogAdapterExpirableCache 数据结构缓存查询到的联系人信息,这样当界面刷新时不需要再次执行查询操作。由于数据库查询操作比较耗时,在 bindView 中不可能等到查询结果返回之后再显示界面。所以在bindView 时采用了这样的处理策略:首先显示通话记录中缓存的联系人信息,然后开启一个线程查询联系人信息,并把这些信息缓存起来。该线程的优先级比较低,它会等 cup 空闲时执行查询联系人的操作。

如果联系人中的信息和通话记录数据库中的信息不一致(其实这种情况比较少见),则发送消息给 CallLogAdapter 重新执行显示操作。具体的流程如下:


该时序图只是展现了主要的框架,忽略了很多细节。

其中 QueryThead 负责查询联系人信息,得到联系人信息缓存到ExpirableCache 中,用于 Bindview 刷新通话记录。

更多相关文章

  1. android中google“定位查询”编辑
  2. android开发 软键盘出现后 防止EditText控件遮挡 整体平移UI
  3. android之电话号码查询
  4. Android(安卓)SDK下, 如何在程序中输出日志 以及如何查看日志
  5. Android获取系统储存以及内存信息的方法(一)
  6. Android第三方授权(新浪微博篇)
  7. 笔记-系统源码常用的Content Provider
  8. 解决android logcat不打印信息
  9. 【Android(安卓)Developers Training】 97. 序言:访问通讯录数据

随机推荐

  1. android 输入法的显示和隐藏
  2. RN调用Java原生方法步骤
  3. Android通过selector改变界面状态
  4. AndroidPN的学习研究(一)环境建立
  5. 修改Android签名文件keystore作为eclipse
  6. Android(安卓)Studio android APP混淆打
  7. 用 Python脚本生成 Android(安卓)SALT 盐
  8. Android(安卓)利用程序实现GPS的打开或关
  9. Android中调用webservice小结
  10. android使用aidl实现进程间通信的实例