加载ConversationListActivity以及延迟的使用

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);

原文地址:https://www.cnblogs.com/fengzhblog/p/3195672.html