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

예 목록보기에서 연락처 이름과 함께 모든 데이터를 표시하려고합니다. 어댑터가있는 지연로드 목록보기에 대해 더 자세히 설명해 주시겠습니까? 아니면 몇 가지 예제 또는 자습서로 전달할 수 있습니까? 답변 – Khushwant

+0

다음은 주제에 대한 빠른 자습서입니다 : http://www.softwarepassion.com/android-series-custom-listview-items-and-adapters/. 잘하면 그것은 당신을 시작할 것입니다. 아이디어는 뷰를 호출 할 때 항목이로드되고 항목이 표시 될 때만 발생한다고 가정합니다. –

+0

튜토리얼을 주셔서 감사합니다.하지만이 튜토리얼에서는 UI가 막히고 있으며 저는 이것을 원하지 않습니다. – Khushwant

관련 문제