在我的应用我列出在ListView接触。 无接触的是1000+。 我得到的接触
通过使用ContentResolver的查询是cr.query(...),存储在一个ArrayList的值
和负载setListAdapter(...)数组列表后。 显示所有联系人我
应用程序需要近1分钟,从而我使用异步任务,但通过使用异步任务没有大的差异。
我需要2到4秒内显示所有联系人。 我检查在Android模拟器默认联系人应用程序这是在2到4秒内的负载。 我有花
很长一段时间在谷歌。 但我无法得到任何有用的解决方案。 请帮助我如何快速列表视图上装载的接触。 请帮我。
我的编码样本:
private ArrayList<ContactListEntry> loadContactListInternal(String searchString) {
ArrayList<ContactListEntry> contactList = new ArrayList<ContactListEntry>();
ContentResolver cr = getContentResolver();
Cursor cur = null;
String[] projection = new String[] {BaseColumns._ID,ContactsContract.Contacts.DISPLAY_NAME,ContactsContract.Contacts.PHOTO_ID};
....
cur=cr.query(ContactsContract.Contacts.CONTENT_URI, projection, selection, null, ContactsContract.Contacts.DISPLAY_NAME + " ASC");
while (cur.moveToNext()) {
int id = Integer.parseInt(cur.getString(0));
....
if (input !=null)
photo = BitmapFactory.decodeStream(input);
....
ArrayList<ContactListEntry.PhoneEntry> phoneEntries = new ArrayList<ContactListEntry.PhoneEntry>();
String[] projection1 = new String[] {ContactsContract.CommonDataKinds.Phone.NUMBER,ContactsContract.CommonDataKinds.Phone.TYPE};
Cursor pcur = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,projection1, ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ?", new String[] { String.valueOf(id) }, null);
while (pcur.moveToNext()) {
...
}
pcur.close();
ContactListEntry entry = new ContactListEntry(id, name, photo, phoneEntries);
contactList.add(entry);
}
cur.close();
return contactList;
}
.....
in another class
private void selectionUpdated() {
....
setListAdapter(new SelectedArrayAdapter(this, app.selectedContacts));
...
}
所以,你的问题是,你为每个联系人做了很多的子查询。 我很久了一次同样的问题。 我的情况是,我发现很多的接触,并允许用户点击其中任何一个。 从那以后,我开始处理在另一活动的联系人。
那时候我终于决定,我应该只显示名称和懒洋洋地获取后来所有其他数据,就在我启动下一个活动。 这是惊人的:几乎200的系数降低我的程序的速度和操作成为用户完全不可见。
默认的Android清单不相同的,如果我没看错的 - 只显示名字,后来就加载所有其他接触相关的数据。
我使用光标适配器和我切割DATABSE,arrayadapter和优化代码。
使用投影和选择论的概念以检索在我的案件为500个联系人的通讯录intially,将采取12秒。
现在,它正在采取350毫秒(每种不超过秒)
void getAllContacts() {
long startnow;
long endnow;
startnow = android.os.SystemClock.uptimeMillis();
ArrayList arrContacts = new ArrayList();
Uri uri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI;
String selection = ContactsContract.Contacts.HAS_PHONE_NUMBER;
Cursor cursor = ctx.getContentResolver().query(uri, new String[]{ContactsContract.CommonDataKinds.Phone.NUMBER, ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME, ContactsContract.CommonDataKinds.Phone._ID, ContactsContract.Contacts._ID}, selection, null, ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME + " ASC");
cursor.moveToFirst();
while (cursor.isAfterLast() == false) {
String contactNumber = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
String contactName = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
int phoneContactID = cursor.getInt(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone._ID));
int contactID = cursor.getInt(cursor.getColumnIndex(ContactsContract.Contacts._ID));
Log.d("con ", "name " + contactName + " " + " PhoeContactID " + phoneContactID + " ContactID " + contactID)
cursor.moveToNext();
}
cursor.close();
cursor = null;
endnow = android.os.SystemClock.uptimeMillis();
Log.d("END", "TimeForContacts " + (endnow - startnow) + " ms");
}
这个链接的更多信息http://www.blazin.in/2016/02/loading-contacts-fast-from-android.html ....
考虑有只有一个查询和摆脱子查询的想法(如已经建议)。 您可以使用内容开放的只是查询实现速度:
"ContactsContract.CommonDataKinds.Phone.CONTENT_URI"
该URI也有“ContactsContract.Contacts.DISPLAY_NAME”字段。
您可能还需要考虑这样做查询,并在一个单独的线程与您的适配器的工作,使其完全透明的。
这为我工作。
优化的解决方案这里.....
private static final String[] PROJECTION = new String[] {
ContactsContract.CommonDataKinds.Phone.CONTACT_ID,
ContactsContract.Contacts.DISPLAY_NAME,
ContactsContract.CommonDataKinds.Phone.NUMBER
};
.
.
.
ContentResolver cr = getContentResolver();
Cursor cursor = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, PROJECTION, null, null, null);
if (cursor != null) {
try {
final int nameIndex = cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME);
final int numberIndex = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER);
String name, number;
while (cursor.moveToNext()) {
name = cursor.getString(nameIndex);
number = cursor.getString(numberIndex);
}
} finally {
cursor.close();
}
}
干杯...:)