Android:手机通讯录查询需要很长时间才能返回结果

时间:2018-01-31 12:10:14

标签: java android sql

我正在使用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秒来检索结果。

任何人都可以帮助我改进。

2 个答案:

答案 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秒