1. 加载会话列表分两步加载。

且第1步和第2步之间有些延迟,便于第1步的结果及时在ListView中显示出来。

mHandler.postDelayed(new LoadThreadsExtra(), 200);

第1步。从threads表中查找出数据,封装成TxrjThread,构建ConversationAdapter,在ListView中显示出来。

第2步。从sms, canonical_address, data等表中查找出hasDraftMsg, hasFailMsg, unreadCount, number, name等信息,调用notifyDataChanged()更新数据。

class LoadThreadsExtra implements Runnable {
   
    List<Long> draftIds = null;
    List<Long> failIds = null;
    Map<Long, Integer> unreadMap = null;
    Map<Integer, String> canonicalAddrMap = null;
    Map<String, String> nameAddrMap = null;

    @Override
    public void run() {
        draftIds = SmsDataManager.getThreadsWithDraftMsg(mContext);
        failIds = SmsDataManager.getThreadsWithFailedMsg(mContext);
        unreadMap = SmsDataManager.getThreadUnreadCountMap(mContext);
        canonicalAddrMap = SmsDataManager.getCanonicalAddressMap(mContext);
        nameAddrMap = SmsDataManager.getNameAddressMap(mContext);
       
        int threadCount = mThreads.size();
        for(int i=0;i<threadCount;i++){
            TxrjThreads thread = mThreads.get(i);
            long threadId = thread.getThreadId();
            thread.setHasDraftMsg(draftIds.contains(threadId));
            thread.setHasFailMsg(failIds.contains(threadId));
            thread.setUnReadCount(unreadMap.containsKey(threadId) ? unreadMap.get(threadId) : 0);
            setNameNumber(thread, thread.getRecipientId());
        }
       
        mHandler.sendEmptyMessage(TxrjConstant.WHAT_NOTIFY_DATA_CHANGED);
    }
   
    private void setNameNumber(TxrjThreads thread, String recipientIds) {
        // 提取Number.
        String[] ids = recipientIds.trim().split(" ");
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < ids.length; i++) {
            sb.append(canonicalAddrMap.get(Integer.valueOf(ids[i])));
            if (i != ids.length - 1) {
                sb.append(",");
            }
        }
        thread.setNumber(sb.toString());
        sb = new StringBuffer();
        // 提取Name.
        String[] numbers = thread.getNumber().split(",");
        for (int i = 0; i < numbers.length; i++) {
            String name = nameAddrMap.get(numbers[i]);
            sb.append(name == null ? numbers[i] : name);
            if (i != numbers.length - 1) {
                sb.append(",");
            }
        }
        thread.setName(sb.toString());
    }
}
2. 进入ConversationListActivity界面中,在加载数据之前也要延迟一点时间,便于Activity将UI及时显示出来,避免了UI显示慢的现象。

mHandler.postDelayed(new Runnable() {
    public void run() {
        new LoadThreadsTask().execute();
    }
}, 200);

加载ConversationListActivity以及延迟的使用的更多相关文章

  1. JAVA的单例模式与延时加载

    延迟加载(lazy load)是(也称为懒加载),也叫延迟实例化,延迟初始化等,主要表达的思想就是:把对象的创建延迟到使用的时候创建,而不是对象实例化的时候创建.延迟加载机制是为了避免一些无谓的性能开 ...

  2. HTML5的学习--performance获取加载时间的工具

    前段时间因为项目需要获取页面加载的时间,就去看了下HTML5中的performane. 可以用其获得页面详细的加载时间. 关于performance的详细内容可以查看 http://www.cnblo ...

  3. 浏览器加载模式:window.onload和$(document).ready()的区别(详解)

    jQuery库文件是在body元素之前加载的,必须等待所有的DOM元素加载后,延迟支持DOM操作,否则就无法获取到. 在延迟等待加载,JavaScript提供了一个事件为load,方法如下: wind ...

  4. js 窗口滚动到一定高度时加载数据

    <script type="text/javascript"> //当窗口滚动到一定高度时 某块页面开始加载数据 window.onload = function() ...

  5. Cocos Creator 资源加载流程剖析【三】——Load部分

    Load流程是整个资源加载管线的最后一棒,由Loader这个pipe负责(loader.js).通过Download流程拿到内容之后,需要对内容做一些"加载"处理.使得这些内容可以 ...

  6. vue-better-scroll实现移动端下拉加载组件

    1.下载安装better-scroll npm i -S better-scroll 1.1安装完成之后,打开pacaage.json文件查看,是否有(better-scroll) "dep ...

  7. vue实现网络图片瀑布流 + 下拉刷新 + 上拉加载更多

    一.思路分析和效果图 用vue来实现一个瀑布流效果,加载网络图片,同时有下拉刷新和上拉加载更多功能效果.然后针对这几个效果的实现,捋下思路: 根据加载数据的顺序,依次追加标签展示效果: 选择哪种方式实 ...

  8. Scala函数式编程(六) 懒加载与Stream

    前情提要 Scala函数式编程指南(一) 函数式思想介绍 scala函数式编程(二) scala基础语法介绍 Scala函数式编程(三) scala集合和函数 Scala函数式编程(四)函数式的数据结 ...

  9. jQuery-瀑布流-绝对定位布局(二)(延迟AJAX加载图片)

    jQuery-瀑布流-绝对定位布局(二)(延迟AJAX加载图片)   瀑布流-绝对定位布局,与浮动布局的区别在于 1.布局不一样: 绝对定位:一个UL里面放置所有的绝对定位的LI: 浮动布局:多个(一 ...

随机推荐

  1. boost::asio::ip::tcp实现网络通信的小例子

    同步方式: Boost.Asio是一个跨平台的网络及底层IO的C++编程库,它使用现代C++手法实现了统一的异步调用模型. 头文件 #include <boost/asio.hpp> 名空 ...

  2. High Availability (HA) 和 Disaster Recovery (DR) 的区别

    High availability 和disaster recovery不是一回事. 尽管在规划和解决方案上有重叠的部分, 它们俩都是business contiunity的子集. HA的目的是在主数 ...

  3. 十个 Laravel 5 程序优化技巧

    性能一直是 Laravel 框架为人诟病的一个点,所以调优 Laravel 程序算是一个必学的技能. 接下来分享一些开发的最佳实践,还有调优技巧,大家有别的建议也欢迎留言讨论. 这里是简单的列表: 配 ...

  4. mysql开启日志sql语句

    #查看日期情况 #show variables like '%general%'; #开启日志 #SET GLOBAL general_log = 'On'; #指定日志文件 #SET GLOBAL ...

  5. offsetof与container_of宏[总结]

    1.前言 今天在看代码时,遇到offsetof和container_of两个宏,觉得很有意思,功能很强大.offsetof是用来判断结构体中成员的偏移位置,container_of宏用来根据成员的地址 ...

  6. LynxFly科研小四轴横空出世,开源,F4,WIFI --(转)

    首先是一大堆的感谢,太多人的帮助,感谢不完了----首先要说明,这个PCB工程的出现要感谢论坛上的台湾大哥 john800422 开源了自己的飞控板的工程文件,我这样的没啥基础的小弟们才能学会如何制板 ...

  7. 基于ARM的模拟器

    ARM的ARMulator: ARMulator 是一个在 ARM 公司推出的集成开发环境 ADS (ARM Developer Suite)中提供的指令集模拟器.它与运行在通用计算机(通常是x86体 ...

  8. 最全的spark基础知识解答

    原文:http://www.36dsj.com/archives/61155 一. Spark基础知识 1.Spark是什么? UCBerkeley AMPlab所开源的类HadoopMapReduc ...

  9. 扩展一个boot的插件—tooltip&做一个基于boot的表达验证

    在线演示 本地下载 (代码太多请查看原文) 加班,加班加班,我爱加班··· 我已经疯了,哦也. 这次发一个刚接触boot的时候用boot做的表单验证,我们扩展一下tooltip的插件,让他可以换颜色. ...

  10. .NET 服务器定位模式(Service Locator Pattern)——Common Service Locator

    本文内容 场景 目标 解决方案 实现细节 思考 相关模式 更多信息 参考资料 Common Service Locator 代码很简单,它一般不会单独使用,而是作为一个单件模式,与像 .net Uni ...