如何在联系人 Android 上添加查询
How to fasten a query on Contacts Android
在我的Android应用程序中,一个Activity用于显示用户phone中的联系人列表。
问题是该操作需要大约 3 秒才能执行,不用说这是完全不能接受的。
这是我使用的代码:
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,因为它不接受重复,并且会保留用于添加元素的顺序。 (我需要保留该订单)
这种查询的标准是要花那么多时间吗?有什么方法可以提高它的性能吗?
您可以使用一些优化来提高代码的性能。虽然我认为这是次要的。
- name和number列获取一次后存储索引
- 您可以使用 ArrayList 构造函数实现删除最后一个 for 循环。
下面是我编写这段代码的方式:
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);
}
在我的Android应用程序中,一个Activity用于显示用户phone中的联系人列表。 问题是该操作需要大约 3 秒才能执行,不用说这是完全不能接受的。 这是我使用的代码:
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,因为它不接受重复,并且会保留用于添加元素的顺序。 (我需要保留该订单)
这种查询的标准是要花那么多时间吗?有什么方法可以提高它的性能吗?
您可以使用一些优化来提高代码的性能。虽然我认为这是次要的。
- name和number列获取一次后存储索引
- 您可以使用 ArrayList 构造函数实现删除最后一个 for 循环。
下面是我编写这段代码的方式:
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);
}