我正在尝试使用此代码获取Android.by中的所有电话号码和电子邮件。
enter code here
String KEY_NAME = "Name";
String KEY_NO = "No";
String selection = ContactsContract.CommonDataKinds.Phone.IN_VISIBLE_GROUP + " = 1";
String sortOrder = ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME + " COLLATE LOCALIZED ASC";
String data="";
String name="";
ContactEntry contactObj;
String id;
List<String> temp = new ArrayList<String>();
final String[] projection = new String[]{ContactsContract.Contacts._ID , ContactsContract.Contacts.DISPLAY_NAME , ContactsContract.Contacts.HAS_PHONE_NUMBER};
final String[] email_projection = new String[] {ContactsContract.CommonDataKinds.Email.DATA , ContactsContract.CommonDataKinds.Email.TYPE};
final String[] phone_projection = new String[] {ContactsContract.CommonDataKinds.Phone.NUMBER, ContactsContract.CommonDataKinds.Phone.TYPE};
ContentResolver cr = context.getContentResolver();
Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI , projection , selection , null , sortOrder);
if(cur.getCount()>0){
while(cur.moveToNext()){
id = cur.getString(cur.getColumnIndex(ContactsContract.Contacts._ID));
name = cur.getString(cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
if (Integer.parseInt(cur.getString(cur.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) {
// get the phone number
Cursor pCur = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI , phone_projection ,
ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = ?",new String[]{id}, null);
while (pCur.moveToNext()){
data = pCur.getString(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
if(!temp.contains(data) && !data.equals(null)){
}
}
pCur.close();
}
Cursor emailCur = cr.query(ContactsContract.CommonDataKinds.Email.CONTENT_URI, email_projection,
ContactsContract.CommonDataKinds.Email.CONTACT_ID + " = ?", new String[]{id}, null);
while (emailCur.moveToNext()){
data = emailCur.getString(emailCur.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA));
if(!temp.contains(data) && !data.equals(null)){
}
}
emailCur.close();
}
}
此代码工作正常。但是对于大量的联系人,让我们说5000个联系人,然后它阻止UI线程。创建一个ListAdapter来显示所有这些联系人。如果我在后台获取所有联系人用户将长时间看到空列表。请建议一些解决方案
答案 0 :(得分:2)
前一段时间我的问题非常相似,即使联系人数量明显减少。
我需要在列表视图中填充所有联系人,并允许用户从中进行选择。最初我在列表视图中加载了所有联系人信息。然而,这确实需要很多查询,这实际上是很慢的。
所以我改变了我的设计:我只选择了联系人姓名和联系人ID,并将其记录在一个对象中。之后,当我的应用程序的用户选择了任何联系人时,我只加载了他的数据。这变得非常快(如预期的那样)。在我的情况下,它工作得很好,因为我查询了很多我从未需要的信息(即所有未选择的联系人的电话号码和电子邮件)。
希望您能够以类似的方式重新设计您的应用。但是,如果你需要立即在listview中显示data
变量的内容,你真的可能需要使用适配器的延迟加载列表视图(我们希望它即使在快速滚动时也能顺利执行)。 / p>