列出所有联系号码和短信的优化方式?

时间:2012-12-09 18:53:50

标签: java android sms contacts

我正在开发一个小应用程序,以便我可以获得更多Android开发经验。我写了一个列出所有联系号码和总消息的方法(就像GoSMS或默认的SMS应用程序一样)。但我现在面临的问题是表现缓慢。以下是我为获得结果所做的工作。

样本结果:AAA先生(10000)

步骤:

  1. 获取所有短信线程ID
  2. 循环并获取总消息属于每个线程ID。
  3. 获取属于该主题的联系号码。
  4. 使用该号码和PhoneLookup获取联系人姓名。
  5. 以下是方法:

    public void populateContactList()
    {
    
        // Get all sms threads
        Cursor smsAddressCursor = getContentResolver().query(
                SMSCVar.CONTENT_URI, 
                new String[] { "DISTINCT "+SMSCVar.THREAD_ID}, 
                null, 
                null, 
                null);
    
        while(smsAddressCursor.moveToNext())
        {
            Contact c = new Contact();
    
            // Get thread_id
            String thread_id = smsAddressCursor.getString(smsAddressCursor.getColumnIndex(SMSCVar.THREAD_ID));
    
            // Get total messages
            Cursor totalMessage = getContentResolver().query(
                    SMSCVar.CONTENT_URI, 
                    new String[] {"count("+SMSCVar.BODY+")"}, 
                    SMSCVar.THREAD_ID+" = ?", 
                    new String[] {thread_id}, 
                    null);
    
            totalMessage.moveToNext();
            c.setNumberOfSMS(totalMessage.getInt(0));
            totalMessage.close();
    
            // Get number
            Cursor number = getContentResolver().query(
                    SMSCVar.CONTENT_URI, 
                    new String[] {SMSCVar.ADDRESS}, 
                    SMSCVar.THREAD_ID+" = ?", 
                    new String[] {thread_id}, 
                    null);
            number.moveToNext();
            String pNumber = number.getString(0);
            number.close();
    
            // Get contact name
            Uri uriPhonenumber = Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI
                    , Uri.encode(pNumber));
    
            Cursor contactDisplayName = getContentResolver().query(
                    uriPhonenumber, 
                    new String[] {ContactsContract.PhoneLookup.DISPLAY_NAME}, 
                    null, 
                    null, 
                    null);
    
            // If cursor is not null and has at least one result
            if(!contactDisplayName.isNull(0) && contactDisplayName.getCount() > 0)
            {
                // Get contact name for display
                contactDisplayName.moveToNext();
                c.setContactName(contactDisplayName
                        .getString(contactDisplayName
                                .getColumnIndex(ContactsContract.PhoneLookup.DISPLAY_NAME)));
            }
            else
            {
                // Get contact number for display
                c.setContactName(pNumber);
            }
    
            // Don't get confuse here, setContactNumber method is not used for display purpose.
            c.setContactNumber(pNumber);
    
            contactListAdapter.add(c);
            contactDisplayName.close();
    
        }
        smsAddressCursor.close();
    
    
    }
    

    我已经编码正确关闭光标但我仍然收到垃圾收集器消息并且慢速检索时间(5秒)。我的短信超过11000条消息。

    所以请帮助我!

    谢谢!

    P / S:我不是英语为母语的人,所以我尽力使我的问题易于理解。

0 个答案:

没有答案