如何在联系人Android上固定查询

时间:2015-05-21 18:58:08

标签: android android-contacts

在我的Android应用程序中,活动是显示用户手机中的联系人列表。 问题是该操作大约需要3秒钟才能执行,不用说这是完全不可接受的。 这是我使用的代码:

private List<Contact> retrieveContacts(ContentResolver contentResolver) {
        LinkedHashSet<Contact> contactSet = new LinkedHashSet<Contact>();
        List<Contact> listContacts = new ArrayList<Contact>();
        final Cursor cursor = contentResolver.query(
                ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
                new String[] {
                        ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME,
                        ContactsContract.CommonDataKinds.Phone.NUMBER }, null,
                null, ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME + " ASC");
        if (cursor == null);
        if (cursor.moveToFirst() == true) {
            do {
                final String name = cursor
                        .getString(cursor
                                .getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
                final String telephone = cursor
                        .getString(cursor
                                .getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
                Contact contact = new Contact(telephone, name, false, false);
                contactSet.add(contact);

            } while (cursor.moveToNext() == true);
        }

        if (cursor.isClosed() == false) {
            cursor.close();
        }
        for (Contact contact : contactSet){
            listContacts.add(contact);
        }
        return listContacts;
    }

然后我使用retrieveContacts的结果填充ListView。 我正在使用LinkedHashSet,因为它不接受重复,并保留用于添加元素的顺序。 (我需要保留该命令)

此类查询的标准是花费那么多时间吗?有没有办法改善其表现?

1 个答案:

答案 0 :(得分:0)

您可以使用一些优化来提高代码的性能。虽然我认为这是次要的。

  1. 在获取一次后存储名称和数字列的索引
  2. 您可以使用ArrayList构造函数实现删除last for循环。
  3. 以下是我将如何编写此代码:

    private List<Contact> retrieveContacts(ContentResolver contentResolver) {
        LinkedHashSet<Contact> contactSet = new LinkedHashSet<Contact>();
        final Cursor cursor = contentResolver.query(
                ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
                new String[] {
                        ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME,
                        ContactsContract.CommonDataKinds.Phone.NUMBER }, null,
                null, ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME + " ASC");
        if (cursor == null);
        if (cursor.moveToFirst()) {
            int nameIndex = cursor
                                .getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME);
            int phoneIndex = cursor
                                .getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER);
            do {
                final String name = cursor
                        .getString(nameIndex);
                final String telephone = cursor
                        .getString(phoneIndex);
                Contact contact = new Contact(telephone, name, false, false);
                contactSet.add(contact);
    
            } while (cursor.moveToNext());
        }
    
        if (!cursor.isClosed()) {
            cursor.close();
        }
    
        return new ArrayList<Contact>(contactSet);
    }