所以我正在开展一个项目,我需要获取用户的联系人列表(特别是姓名,电子邮件地址和联系人详细信息的位置),将其放入列表中,然后使用该列表在自动完成视图中,以便他们可以开始键入名称,并将其过滤掉。
我的代码工作正常,它都编译并且所有运行都没有错误。问题是它非常慢。对于有10个联系人的人来说,这可能不会花费很长时间,但我的手机里面有1700个联系人,所以整个过程需要2分钟才能完成......这太可怕了!
以下是当前的工作代码(我删除了添加位置的代码,因为它很冗长):
public static List<MyObject> getContactList(){
List<MyObject> contactList = new ArrayList<>();
Cursor people = MyApplication.getAppContext().getContentResolver().
query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
while (people.moveToNext()) {
String email = "";
String location = "";
String phone = "";
String contactName = people.getString(people.getColumnIndex(
ContactsContract.Contacts.DISPLAY_NAME));
String contactId = people.getString(people.getColumnIndex(
ContactsContract.Contacts._ID));
if(contactId != null){
Cursor contactsEmails = getSpecificEmailsCursor(contactId);
while (contactsEmails.moveToNext()){
//For now, just setting it to the last email
email = contactsEmails.getString(contactsEmails.getColumnIndex(
ContactsContract.CommonDataKinds.Email.DATA));
phone = contactsEmails.getString(contactsEmails.getColumnIndex(
ContactsContract.CommonDataKinds.Phone.NUMBER));
}
contactsEmails.close();
MyObject person = new MyObject();
try{
person.setEmail(email);
person.setName(contactName);
person.setPhone(phone);
} catch (NullPointerException e){
L.m("Null pointer hit on person");
}
if(contactName != null && email != null){
contactList.add(person);
}
}
}
people.close();
return contactList;
}
有没有人就如何加快这个过程提出任何建议,或者更好地了解我想要实现的目标?谢谢!
-Sil