Проблема с производительностью при получении контактов

Я пытаюсь получить контакты устройства Android. Я нашел отличный пример кода здесь

. Однако при попытке заполнить ListActivityс помощью ArrayAdapter, который использует этот код, требуется много времени — почти 4 секунды на galaxy s2 и многое другое на старых устройствах. Мне нужно улучшить эту производительность. Я думал реализовать Cursor, который будет содержать более одного измерения Cursor, и использовать SimpleCursorAdapterв качестве адаптера списка.
Я вижу несколько проблем с этим подходом:

  • Я не знаю, как получить элемент в определенной позиции.
  • каждый курсор имеет разные столбцы.

Есть ли лучший/более простой способ сделать это?

РЕДАКТИРОВАТЬ:

вот мой код:

public List readContacts(){
    ContentResolver cr = getContentResolver();
    List cd = new ArrayList();
    Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI,
           null, null, null, ContactsContract.Contacts.DISPLAY_NAME);

    if (cur.getCount() > 0) {
       while (cur.moveToNext()) {
           String id = cur.getString(cur.getColumnIndex(ContactsContract.Contacts._ID));
           String name = cur.getString(cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
           if (Integer.parseInt(cur.getString(cur.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) {

               // get the phone number
               Cursor pCur = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null,
                                      ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = ?",
                                      new String[]{id}, null);
               while (pCur.moveToNext()) {
                     String phone = pCur.getString(
                            pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
                     if (!Utils.isEmpty(phone)) {
                         cd.add(new ContactData(id, name, phone));
                     }
               }
               pCur.close();


           }
       }
  }
    return cd;
}

РЕДАКТИРОВАТЬ 2:

удалось исправить его, изменив его только на один запрос:

public List readContacts(){
    ContentResolver cr = getContentResolver();
    List cd = new ArrayList();
               Cursor pCur = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
                       new String[]{ContactsContract.CommonDataKinds.Phone._ID,ContactsContract.CommonDataKinds.Phone.NUMBER,ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME_PRIMARY},
                       ContactsContract.CommonDataKinds.Phone.NUMBER + " IS NOT NULL",
                                      null, 
                                      ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME_PRIMARY);
               while (pCur.moveToNext()) {
                     String phone = pCur.getString(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
                     String id = pCur.getString(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone._ID));
                     String name = pCur.getString(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME_PRIMARY));
                         ContactData cd1 = contactDataProvider.get();
                         cd1.id = id;
                         cd1.name = name;
                         cd1.phone = phone;
                         cd.add(cd1);
               }
               pCur.close();
    return cd;
}

5
задан oshai 6 June 2012 в 21:23
поделиться