2016-06-23 1 views
0

휴대 전화 주소록을 읽고 목록 형식으로 표시하는 앱에서 작업하고 있습니다. 선택한 연락처에 메시지를 보내야합니다. 그러나 문제는 모바일에 500 개 이상의 연락처가있는 경우 앱이 정지된다는 것입니다. 문제가있는 곳을 찾지 못했습니다.연락처를 읽으려고 할 때 앱이 멈추는 경우

이 코드는 인터넷에서 발견되었으며 내 앱에서 구현되었습니다. 연락처가 표시되지만 시간이 많이 걸립니다. AssyncTask이 코드 때문에 백그라운드 스레드에서 읽기를 사용하는

private void fetchContacts() { 
    Cursor phones = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null, null); 
    while (phones.moveToNext()) { 
     String name = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME)); 
     String phoneNumber = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); 
     if (name == null || name.equals("")) 
      name = phoneNumber; 
     if (Utils.notNull(phoneNumber)) { 
      phoneNumber = Utils.checkAndWrapMobileNumber(getApplicationContext(), phoneNumber); 
      allContacts.put(phoneNumber, name); 
      contactList.add(phoneNumber); 
     } 
    } 
    phones.close(); 
} 

그리고 더 나은 - 여기 내 코드

ContentResolver cr = getActivity().getContentResolver(); 
Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI,null, null,null,null); 
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) { 
     Cursor pCur = 
       cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, 
       null, 
       ContactsContract.CommonDataKinds.Phone.CONTACT_ID +"=?", 
       new String[]{id}, null); 
     while (pCur.moveToNext()) { 
       int phoneType = pCur.getInt(pCur.getColumnIndex(
        ContactsContract.CommonDataKinds.Phone.TYPE)); 
       String phoneNumber = pCur.getString(pCur.getColumnIndex(
        ContactsContract.CommonDataKinds.Phone.NUMBER)); 
       switch (phoneType) { 
        case Phone.TYPE_MOBILE: 
         Log.e(name + "(mobile number)", phoneNumber); 
         break; 
        case Phone.TYPE_HOME: 
         Log.e(name + "(home number)", phoneNumber); 
         break; 
        case Phone.TYPE_WORK: 
         Log.e(name + "(work number)", phoneNumber); 
         break; 
        case Phone.TYPE_OTHER: 
         Log.e(name + "(other number)", phoneNumber); 
         break;         
        default: 
         break; 
       } 
      } 
      pCur.close(); 
    } 
} } 
+0

그리고 무엇이 문제입니까? 지연, 연락처가 표시되지 않습니까? 제발 우리에게 더 많은 정보를 –

+0

코드를 게시하십시오 – Stallion

답변

1

읽으려면 연락처입니다.

은 당신을 도울 것입니다 희망 :

0

는 블록 UI는,이 목적을 위해 AyncTask를 사용하는 것이 UI 스레드에서 무거운 작업 때문입니다.