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

问题描述:

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

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,因为它不接受重复,并且它保持用于添加元素的顺序。 (我需要保留那个订单)

这样的查询需要花费那么多时间吗?有什么办法可以改善它的表现吗?

+0

“多少时间”?你有多少联系人,以及“多少时间”是多少? – pskink

+0

我在我的问题中提到了3秒钟。在我的情况下,大约有一百个联系人,我认为它不是那么大。 – Kritias

+0

嗯,它应该采取 pskink

您可以使用一些优化来提高代码的性能。虽然我认为它会很小。得到它,一旦

  • 你可以删除最后与ArrayList的构造函数实现循环后名称和编号列的

    1. 存储索引。

    这是我怎么会写这样的代码:

    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); 
    } 
    
  • +1

    实际上它确实改善了事情,现在执行时间大约为1秒,这相当好!谢谢你。 – Kritias