마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

주소록 로딩 시간 관련 질문드립니다.

0 추천

아래 소스와 같이 이메일과 전화번호를 찾아 총 세번(main, email, phone number)에 루프를 돌려 리스트에 넣어주고 있습니다. 

500개정도의 주소록이 있을 때 약 50초가 소요되고 있는데, 개선 시킬 수 있는 방법이 없을까요? 경험자분 조언부탁드립니다.

    public void getContactList() {
        ContentResolver cr = App.context.getContentResolver();
        Cursor cursor = cr.query(Contacts.CONTENT_URI, null, null, null, Contacts.SORT_KEY_PRIMARY + " ASC");
        while(cursor.moveToNext()) {
            ContactModel contactModel;
            boolean emailsAdded = false;

            String contactId = cursor.getString(cursor.getColumnIndex(Contacts._ID));
            String contactName = cursor.getString(cursor.getColumnIndex(Contacts.DISPLAY_NAME_PRIMARY));
            boolean bHasPhoneNumber = (Integer.parseInt(cursor.getString(
                    cursor.getColumnIndex(Contacts.HAS_PHONE_NUMBER))) > 0);

            Cursor emails = cr.query(Email.CONTENT_URI, null, Email.CONTACT_ID + " = " + contactId, null, null);

            while (emails.moveToNext()) {
                emailsAdded = true;
                contactModel = new ContactModel();
                contactModel.Name = contactName;
                contactModel.Email = emails.getString(emails.getColumnIndex(Email.DATA));
                if(UserManager.getUserInfoModel().UserEmail !=null) {
                    if (contactModel.Email.equals(UserManager.getUserInfoModel().UserEmail)) {
                        continue;
                    }
                }

                InfoModel im = infoManager.getInfoByEmail(contactModel.Email);
                if(im != null) {
                    continue;
                }

                ContactList.add(contactModel);
            }
            emails.close();

            if (!emailsAdded) {
                if (bHasPhoneNumber) {
                    Cursor phones = cr.query(Phone.CONTENT_URI, null, Phone.CONTACT_ID + " = " + contactId, null, null);

                    while (phones.moveToNext()) {
                        int type = phones.getInt(phones.getColumnIndex(Phone.TYPE));
                        if (type == Phone.TYPE_MOBILE) {
                            contactModel = new ContactModel();
                            contactModel.Name = contactName;
                            contactModel.Phone = phones.getString(phones.getColumnIndex(Phone.NUMBER));
                            ContactList.add(contactModel);
                            break;
                        }
                    }
                    phones.close();
                }
            }
        }
        cursor.close();
    }

 

익명사용자 님이 2016년 9월 7일 질문
루프가 많이 돌기 때문에 칼럼을 접근하실 때는 constant를 사용하시는게 더 유리합니다.

static final int ID_INDEX = 0;

String contactId = cursor.getString(ID_INDEX);

그리고 여기를 참고해 보세요.
http://stackoverflow.com/questions/26804387/android-fetch-all-contact-list-name-email-phone-takes-more-then-a-minute-for/26820544#26820544

답변 달기

· 글에 소스 코드 보기 좋게 넣는 법
· 질문에 대해 추가적인 질문이나 의견이 있으면 답변이 아니라 댓글로 달아주시기 바랍니다.
표시할 이름 (옵션):
개인정보: 당신의 이메일은 이 알림을 보내는데만 사용됩니다.
스팸 차단 검사:
스팸 검사를 다시 받지 않으려면 로그인하거나 혹은 가입 하세요.
...