有没有更好的方法来检索与电话号码关联的联系人姓名?

时间:2012-01-27 19:04:37

标签: android android-contacts

我有一个电话号码列表,我需要将其转换为相应联系人姓名的列表,所以我有一个方法,用联系人列表依次检查每个号码并返回名称。

由于列表大约有20个数字长,所以这样做有一点延迟,可能是1 1/2秒,理想情况下我想减少。我想知道我能做些什么来优化我的代码?

我像这样调用方法getContactDisplayNameByNumber()

ArrayList<String> tableCol1 = new ArrayList<String>();

for (int j = 0; j < tableCol1.size(); j++) {
        String name = getContactDisplayNameByNumber(tableCol1.get(j));
        tableCol1.set(j, name);
        }

以下是方法:

public String getContactDisplayNameByNumber(String number) {
    Uri uri = Uri.withAppendedPath(
            ContactsContract.PhoneLookup.CONTENT_FILTER_URI,
            Uri.encode(number));
    String name = "?";

    ContentResolver contentResolver = getContentResolver();
    Cursor contactLookup = contentResolver.query(uri, new String[] {
            BaseColumns._ID, ContactsContract.PhoneLookup.DISPLAY_NAME },
            null, null, null);

    try {
        if (contactLookup != null && contactLookup.getCount() > 0) {
            contactLookup.moveToNext();
            name = contactLookup.getString(contactLookup
                    .getColumnIndex(ContactsContract.Data.DISPLAY_NAME));
        }
    } finally {
        if (contactLookup != null) {
            contactLookup.close();
        }
    }

    return name;
}

如果我把for循环放在方法中,它是否会减少延迟,并使它成为一个返回所有名称的方法,而不只是一个?

1 个答案:

答案 0 :(得分:1)

我相信你的问题可能有两个问题。

i)也许您没有使用最佳方法进行查询。由于我自己还没有这样做,我可以问你是否可以看看这个问题来确认。 How to read contacts on Android 2.0

ii)如果那不是问题,那么也许你可以试一试。为什么不按特定顺序对数字进行排序(比如增加)。获取所有联系人。还可以使用相同顺序的order by子句在电话号码字段中输入查询结果。现在尝试检查列表中的第一个号码。如果在查询结果中的索引i处找到它,则可以确保列表中的下一个数字只能在查询结果中的索引大于i时找到。您不必迭代以前的i-1查询结果。订单从n ^ n减少到nlogn。 这样,您只能对联系人进行一次查询

P.S。恕我直言这么小的数据集我相信性能的主要问题是多个查询。