在我的Android应用程序中,活动是显示用户手机中的联系人列表。 问题是该操作大约需要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,因为它不接受重复,并保留用于添加元素的顺序。 (我需要保留该命令)
此类查询的标准是花费那么多时间吗?有没有办法改善其表现?
答案 0 :(得分:0)
您可以使用一些优化来提高代码的性能。虽然我认为这是次要的。
以下是我将如何编写此代码:
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);
}