我正在使用Voip应用程序,所以我必须显示所有联系人以便用户调用它。
所以我使用了以下功能:
public void GetContactsIntoArrayList(){
int i = 0 ;
cursor = getActivity().getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,null, null, ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME);
HashSet<String> tempHash = new HashSet<String >();
while (cursor.moveToNext()) {
Person per = new Person();
Bitmap bit_thumb ;
name = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
phonenumber = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
contactId = cursor.getColumnIndex(ContactsContract.Contacts._ID);
per.setName(name);
per.setNumber(phonenumber);
//
if(tempHash.add(name) ){
i++ ;
StoreContacts.add(per );
}
}
Toast.makeText( getActivity()," "+i , Toast.LENGTH_LONG).show();
cursor.close();
adapter = new ContactListViewAdapter(getContext() , StoreContacts) ;
contactsListView.setAdapter(adapter);
}
当我的联系人数少于5000时,一切都很好。
但是现在我的手机上有20000个联系人需要大约13秒来检索结果。
任何人都可以帮助我改进。
答案 0 :(得分:1)
假设您的手机中有100,000个联系人,光标加载需要一分钟,而这个加载时间对于用户而言非常烦人。 一种解决方案是使用限制来获取联系人,例如
SELECT * FROM TABLE LIMIT 0,30
然后填充listview(RecyclerView)。 这种方式比提取
更有意义SELECT * FROM TABLE
因为我们无法同时显示100,000个联系人, 当用户开始滚动并达到元素第一个限制的底部时,获取下一个联系人限制并更新列表视图。
因为在我们的例子中我们没有处理SQL表, 在ContentProvider中设置限制;
Cursor c = resolver.query(
MyTable.CONTENT_URI,
MyTable.PROJECTION,
null,
null,
" limit 1 offset 2");
答案 1 :(得分:0)
我通过单独的游标变量初始化
解决了我的问题看起来像这样:
cursor = getActivity().getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,null, null, ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME);
我用以下代码替换它:
String[] projection = new String[]{ContactsContract.CommonDataKinds.Phone._ID, ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME, ContactsContract.CommonDataKinds.Phone.NUMBER};
String orderBy = ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME;
Uri uri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI;
cursor = getActivity().getContentResolver().query( uri, projection, null, null, orderBy) ;
现在它的作品20,000接触需要1秒