2017-02-15 1 views
1

Dans mon code, le chargement des contacts prend trop de temps pour aller chercher les contacts et les afficher dans l'application. S'il vous plaît me guider où je me trompe et que dois-je corriger afin de rendre le temps d'exécution rapide.L'extraction des contacts prend trop de temps

Voici mon code. Et plus dans mon code mon contact récupérant alors que la boucle est en boucle 3 fois je ne sais pas pourquoi.

+0

Pourquoi mes contacts sont-ils en boucle 3 fois? Tout devine .. –

Répondre

1

J'ai fait face à cette situation comme vous êtes en ce moment. Essayez ci-dessous code

public static ArrayList ReadContactsSpecialWay(Context context) { 
    StringBuffer contactBuffer = new StringBuffer(); 
    StringBuffer emailBuffer = new StringBuffer(); 

    ArrayList<String> contactList = new ArrayList<>(); 
    ArrayList<String> emailList = new ArrayList<>(); 
    ArrayList<ContactModel> contactModelsList = new ArrayList<>(); 
    HashMap<Integer, Boolean> hashMap = new HashMap<Integer, Boolean>(); 
    String[] emailsAndContacts = new String[2]; 

    // Phone numbers 
    Uri uri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI; 
    String[] projection = new String[]{ 
      ContactsContract.CommonDataKinds.Phone.CONTACT_ID, 
      ContactsContract.Contacts.DISPLAY_NAME, 
      ContactsContract.CommonDataKinds.Phone.NUMBER 
    }; 

    Cursor phoneNumbers = context.getContentResolver().query(uri, projection, null, null, null); 
    int indexContactID = phoneNumbers.getColumnIndex(ContactsContract.CommonDataKinds.Phone.CONTACT_ID); 
    int indexName = phoneNumbers.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME); 
    int indexNumber = phoneNumbers.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER); 
    while (phoneNumbers.moveToNext()) { 
     Integer contactId = phoneNumbers.getInt(indexContactID); 
     String contactName = phoneNumbers.getString(indexName); 
     String contactNumber = phoneNumbers.getString(indexNumber).replace(" ", ""); 

     ContactModel contactModel = new ContactModel(); 
     contactModel.setContactPhone(contactNumber); 
     contactNumber = contactModel.getContactPhone(); 

     if (hashMap.containsKey(contactId)) 
      contactModel.setContactName(contactName + " (" + contactNumber + ")"); 
     else { 
      hashMap.put(contactId, true); 
      contactModel.setContactName(contactName); 
     } 
     contactModelsList.add(contactModel); 
     contactList.add(contactNumber); 
     LogHelper.informationLog(contactNumber + " " + contactName); 
     contactBuffer.append(contactNumber + ","); 
    } 
    phoneNumbers.close(); 

    // Emails 
    uri = ContactsContract.CommonDataKinds.Email.CONTENT_URI; 
    projection = new String[]{ 
      ContactsContract.CommonDataKinds.Email.CONTACT_ID, 
      ContactsContract.Contacts.DISPLAY_NAME, 
      ContactsContract.CommonDataKinds.Email.DATA 
    }; 
    Cursor emails = context.getContentResolver().query(uri, projection, null, null, null); 
    indexContactID = emails.getColumnIndex(ContactsContract.CommonDataKinds.Email.CONTACT_ID); 
    indexName = emails.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME); 
    int indexData = emails.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA); 
    while (emails.moveToNext()) { 
     Integer contactId = emails.getInt(indexContactID); 
     String contactName = emails.getString(indexName); 
     String contactEmail = emails.getString(indexData).toLowerCase(); 
     ContactModel contactModel = new ContactModel(); 
     contactModel.setEmailAddress(contactEmail); 

     if (hashMap.containsKey(contactId)) { 
      contactModel.setEmailName(contactName + " (" + contactEmail + ")"); 
     } else { 
      contactModel.setEmailName(contactName); 
      hashMap.put(contactId, true); 
     } 
     contactModelsList.add(contactModel); 

     if (contactEmail != null && !emailList.contains(contactEmail)) { 
      emailList.add(contactEmail); 
      LogHelper.informationLog(contactEmail + " " + contactName); 
      emailBuffer.append(contactEmail + ","); 
     } 
    } 
    emails.close(); 

    if (contactBuffer.toString().length() > 0) { 
     emailsAndContacts[0] = contactBuffer.toString().substring(0, (contactBuffer.toString().length() - 1)); 
    } else 
     emailsAndContacts[0] = ""; 

    if (emailBuffer.toString().length() > 0) { 
     emailsAndContacts[1] = emailBuffer.toString(); 
    } else { 
     emailsAndContacts[1] = ""; 
    } 

    if(contactModelsList.size() == 0) 
     return null; 
    else { 
     ArrayList specialList = new ArrayList(); 
     specialList.add(contactModelsList); 
     specialList.add(emailsAndContacts); 

     return specialList; 
    } 
} 

Il va certainement vous aider.

+0

pourquoi mes contacts sont-ils en boucle 3 fois ?? Tout devine .. Merci pour la réponse je vais l'essayer. –

0

Essayez ceci en utilisant AsyncTask. Utilisez-le lors du lancement de l'activité par défaut des applications en arrière-plan et récupérez le tableau lors de l'utilisation sur une autre activité

class LoadContact extends AsyncTask<Void, Void, Void> { 
    @Override 

    protected void onPreExecute() { 
     super.onPreExecute(); 
    } 

    @Override 
    protected Void doInBackground(Void... voids) { 
     // Get Contact list from Phone 

     Uri CONTENT_URI = ContactsContract.Contacts.CONTENT_URI; 

     String _ID = ContactsContract.Contacts._ID; 

     String DISPLAY_NAME = ContactsContract.Contacts.DISPLAY_NAME; 
     Uri PhoneCONTENT_URI = ContactsContract.CommonDataKinds.Phone.CONTENT_URI; 

     String Phone_CONTACT_ID = ContactsContract.CommonDataKinds.Phone.CONTACT_ID; 

     String NUMBER = ContactsContract.CommonDataKinds.Phone.NUMBER; 

     ContentResolver contentResolver = getContentResolver(); 

     /** 
     * @discussion Query contact and return name and contact Id. 
     */ 
     Cursor cursor = contentResolver.query(CONTENT_URI, null, null, null, ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME + " ASC"); 

     if (cursor.getCount() > 0) { 
      while (cursor.moveToNext()) { 
       Bitmap bit_thumb = null; 

       String contact_id = cursor.getString(cursor.getColumnIndex(_ID)); 
       String name = cursor.getString(cursor.getColumnIndex(DISPLAY_NAME)); 

       String image_thumb = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.PHOTO_THUMBNAIL_URI)); 
       Cursor phoneCursor = contentResolver.query(PhoneCONTENT_URI, null, Phone_CONTACT_ID + " = ?", new String[]{contact_id}, null); 
       try { 
        if (image_thumb != null) { 
         bit_thumb = MediaStore.Images.Media.getBitmap(contentResolver, Uri.parse(image_thumb)); 
        } 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 


       while (phoneCursor.moveToNext()) { 
        String phoneNumber = phoneCursor.getString(phoneCursor.getColumnIndex(NUMBER)); 

        final SelectUser selectUser = new SelectUser(); 
        selectUser.setName(name); 
        selectUser.setContactId(contact_id + "" + phoneNumber); 
        selectUser.setThumb(bit_thumb); 
        selectUser.setPhone(phoneNumber); 
        if (selectUser.getPhone() != null && selectUser.getPhone().length() > 0 && !num.equalsIgnoreCase(phoneNumber)) { 
         num = phoneNumber; 
         selectUsers.add(selectUser); 
        } 
       } 
       phoneCursor.close(); 
       Cursor cur1 = contentResolver.query(
         ContactsContract.CommonDataKinds.Email.CONTENT_URI, null, 
         ContactsContract.CommonDataKinds.Email.CONTACT_ID + " = ?", 
         new String[]{contact_id}, null); 
       while (cur1.moveToNext()) { 
        String email = cur1.getString(cur1.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA)); 
        final SelectUser selectUser = new SelectUser(); 
        selectUser.setName(name); 
        selectUser.setContactId(contact_id + "" + email); 
        selectUser.setThumb(bit_thumb); 
        selectUser.setEmail(email); 
        if (selectUser.getEmail() != null && selectUser.getEmail().length() > 0 && !userEmail.equalsIgnoreCase(email)) { 
         userEmail=email; 
         selectUsers.add(selectUser); 
        } 
       } 
       cur1.close(); 


      } 
     } 
     cursor.close(); 
     return null; 
    } 

    @Override 
    protected void onPostExecute(Void aVoid) { 
     super.onPostExecute(aVoid); 
     isContactLoaded = true; 

    } 
}