2

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

样本结果:AAA 先生 (10000)

脚步:

  1. 获取所有短信线程 ID
  2. 循环并获取属于每个线程 ID 的消息总数。
  3. 获取属于该线程的联系电话。
  4. 使用该号码和 PhoneLookup 获取联系人姓名。

这是方法:

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


}

我已经编码正确关闭光标,但我仍然收到 GARBAGE COLLECTOR 消息和缓慢的检索时间(5 秒)。我的短信超过 11000 条。

所以请帮助我!

谢谢!

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

4

0 回答 0