如何在联系人上查询联系人Android
问题描述:
在我的Android应用程序中,活动是显示用户手机中的联系人列表。 问题是,该操作需要大约3秒钟执行,不用说这是完全不可接受的。 这里是我使用的代码:如何在联系人上查询联系人Android
private List<Contact> retrieveContacts(ContentResolver contentResolver) {
LinkedHashSet<Contact> contactSet = new LinkedHashSet<Contact>();
List<Contact> listContacts = new ArrayList<Contact>();
final Cursor cursor = contentResolver.query(
ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
new String[] {
ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME,
ContactsContract.CommonDataKinds.Phone.NUMBER }, null,
null, ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME + " ASC");
if (cursor == null);
if (cursor.moveToFirst() == true) {
do {
final String name = cursor
.getString(cursor
.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
final String telephone = cursor
.getString(cursor
.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
Contact contact = new Contact(telephone, name, false, false);
contactSet.add(contact);
} while (cursor.moveToNext() == true);
}
if (cursor.isClosed() == false) {
cursor.close();
}
for (Contact contact : contactSet){
listContacts.add(contact);
}
return listContacts;
}
我然后填充retrieveContacts的结果一个ListView。 我正在使用LinkedHashSet,因为它不接受重复,并且它保持用于添加元素的顺序。 (我需要保留那个订单)
这样的查询需要花费那么多时间吗?有什么办法可以改善它的表现吗?
答
你可以删除最后与ArrayList的构造函数实现循环后名称和编号列的
您可以使用一些优化来提高代码的性能。虽然我认为它会很小。得到它,一旦
- 存储索引。
这是我怎么会写这样的代码:
private List<Contact> retrieveContacts(ContentResolver contentResolver) {
LinkedHashSet<Contact> contactSet = new LinkedHashSet<Contact>();
final Cursor cursor = contentResolver.query(
ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
new String[] {
ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME,
ContactsContract.CommonDataKinds.Phone.NUMBER }, null,
null, ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME + " ASC");
if (cursor == null);
if (cursor.moveToFirst()) {
int nameIndex = cursor
.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME);
int phoneIndex = cursor
.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER);
do {
final String name = cursor
.getString(nameIndex);
final String telephone = cursor
.getString(phoneIndex);
Contact contact = new Contact(telephone, name, false, false);
contactSet.add(contact);
} while (cursor.moveToNext());
}
if (!cursor.isClosed()) {
cursor.close();
}
return new ArrayList<Contact>(contactSet);
}
+1
实际上它确实改善了事情,现在执行时间大约为1秒,这相当好!谢谢你。 – Kritias
“多少时间”?你有多少联系人,以及“多少时间”是多少? – pskink
我在我的问题中提到了3秒钟。在我的情况下,大约有一百个联系人,我认为它不是那么大。 – Kritias
嗯,它应该采取 pskink