我有一个电话号码列表,我需要将其转换为相应联系人姓名的列表,所以我有一个方法,用联系人列表依次检查每个号码并返回名称。
由于列表大约有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循环放在方法中,它是否会减少延迟,并使它成为一个返回所有名称的方法,而不只是一个?
答案 0 :(得分:1)
我相信你的问题可能有两个问题。
i)也许您没有使用最佳方法进行查询。由于我自己还没有这样做,我可以问你是否可以看看这个问题来确认。 How to read contacts on Android 2.0
ii)如果那不是问题,那么也许你可以试一试。为什么不按特定顺序对数字进行排序(比如增加)。获取所有联系人。还可以使用相同顺序的order by子句在电话号码字段中输入查询结果。现在尝试检查列表中的第一个号码。如果在查询结果中的索引i处找到它,则可以确保列表中的下一个数字只能在查询结果中的索引大于i时找到。您不必迭代以前的i-1查询结果。订单从n ^ n减少到nlogn。 这样,您只能对联系人进行一次查询
P.S。恕我直言这么小的数据集我相信性能的主要问题是多个查询。