2012-03-03 48 views
0

我正嘗試使用此代碼獲取Android.by中的所有電話號碼和電子郵件。正在獲取大量聯繫人

enter code here 

      String KEY_NAME = "Name"; 
      String KEY_NO = "No"; 

    String selection = ContactsContract.CommonDataKinds.Phone.IN_VISIBLE_GROUP + " = 1"; 
    String sortOrder = ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME + " COLLATE LOCALIZED ASC"; 


    String data=""; 
    String name=""; 
    ContactEntry contactObj; 
    String id; 

    List<String> temp = new ArrayList<String>(); 

    final String[] projection = new String[]{ContactsContract.Contacts._ID , ContactsContract.Contacts.DISPLAY_NAME , ContactsContract.Contacts.HAS_PHONE_NUMBER}; 

    final String[] email_projection = new String[] {ContactsContract.CommonDataKinds.Email.DATA , ContactsContract.CommonDataKinds.Email.TYPE}; 

    final String[] phone_projection = new String[] {ContactsContract.CommonDataKinds.Phone.NUMBER, ContactsContract.CommonDataKinds.Phone.TYPE}; 

    ContentResolver cr = context.getContentResolver(); 
    Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI , projection , selection , null , sortOrder); 

    if(cur.getCount()>0){ 

     while(cur.moveToNext()){ 

      id = cur.getString(cur.getColumnIndex(ContactsContract.Contacts._ID)); 
      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 , phone_projection , 
             ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = ?",new String[]{id}, null); 

       while (pCur.moveToNext()){ 

         data = pCur.getString(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); 

         if(!temp.contains(data) && !data.equals(null)){ 

         } 
       } 
        pCur.close(); 
      } 

      Cursor emailCur = cr.query(ContactsContract.CommonDataKinds.Email.CONTENT_URI, email_projection, 
             ContactsContract.CommonDataKinds.Email.CONTACT_ID + " = ?", new String[]{id}, null); 

      while (emailCur.moveToNext()){ 


       data = emailCur.getString(emailCur.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA)); 

       if(!temp.contains(data) && !data.equals(null)){    

       } 
      } 
      emailCur.close(); 

     } 

    } 

此代碼工作正常。但對於大量的聯繫人,讓我們說5000個聯繫人然後它阻止UI線程創建一個ListAdapter顯示所有這些聯繫人。如果我獲取所有聯繫人在後臺用戶將看到很長一段時間的空列表。提出了一些解決方案

回答

1

我甚至有顯著數量較少接觸的前一段時間有非常類似的問題。

我需要填充列表視圖中的所有聯繫人,並允許用戶從中選擇。最初,我在列表視圖中加載了所有聯繫信息。然而,這需要很多查詢,這實際上很慢。

所以我改變了我的設計:我只選擇了聯繫人姓名和聯繫人ID,並將其記錄在一個對象中。之後當我的應用程序的用戶選擇了任何聯繫人時,我只加載了他的數據。這轉變得非常快(如預期)。在我的情況下,它工作得很好,因爲我查詢了很多我從來沒有需要的信息(即所有未選定聯繫人的電話號碼和電子郵件)。

希望你將能夠重新設計你的應用程序中類似的方式。但是,如果您需要立即在列表視圖中顯示data變量的內容,您可能會轉而需要使用適配器進行延遲加載列表視圖(讓我們希望它即使在快速滾動時也能順利執行)。

+0

是的,我想在列表view.Could請您解釋一下懶加載列表視圖與適配器或者你可以轉發給我一些例子或tutorials.And感謝您的快速與聯繫人姓名一起顯示所有數據回答 – Khushwant 2012-03-03 12:58:58

+0

以下是關於該主題的一個快速教程:http://www.softwarepassion.com/android-series-custom-listview-items-and-adapters/。希望它會讓你開始。這個想法是,只有當get view被調用時纔會加載項目,並且這大概只在顯示項目時纔會發生。 – 2012-03-03 13:08:38

+0

感謝您的教程。但在本教程中UI被阻止,我不想要這個。 – Khushwant 2012-03-05 12:55:47