欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android Mms之:深入理解对话列表管理

程序员文章站 2023-11-20 18:10:46
conversation这个类主要表示对话的数据结构,其内持有一个thread所有的相关信息,如recipients,threadid等等,也用于管理thread,比如查询...

conversation这个类主要表示对话的数据结构,其内持有一个thread所有的相关信息,如recipients,threadid等等,也用于管理thread,比如查询thread,删除thread,更新thread,管理threadid,管理thread的联系人等等。因为thread表与其他表关联的信息比较多,如联系人,消息个数,这些信息有些直接会写在数据库。因为thread上面的信息比较多,所以加载时会较费时,因此就有了一个在conversation内部的cache来提高加载thread的速度。

获得conversation对象的方式都是通过conversation的静态方法conversation.get(),这个方法先从内部的cache来取conversation对象,如果cache中没有就构建对象,并从数据库中加载信息放到对象中。

因为一个conversation代表着一个thread,所以conversation的内部cache的实现数据结构是一个hashset,里面每一个元素都是一个conversation对象。它提供了几个操作cache的方法:get, put, remove, replace等。每个conversation对象只能添加一次,否则会有exception抛出。但是这个cache的实现方式很不高效,直接用一个hashset<conversation>,所以在get和replace时,很不方便。更好的实现方式应该是一个hash表,键是threadid,值就是conversation对象,这样就可以利用hash的高效率的优势来进行查询和替换等操作。这个cache的实现方式很简单,converation.init()方法会调用cacheallthreads()进行cache的工作。当mms启动的时候,以及thread发生变化时,如删除thread时也都会调用conversation.init()来进行cache的更新。convresation.init()会启动一个新的线程并在线程中调用cacheallthreads()来构建conversation的cache,而获取conversation的方法如conversation.get()都会先试图从它的cache中来拿conversation对象,如果cache中没有,就新建一个conversation,并加入到cache中。cacheallthreads()会从数据库中查询出所有的thread,构建新的conversation对象,把数据库的信息全总加到conversation对象中去,然后 放入到cache中。