联系人提取花费太多时间 [英] Contact fetching takes too much time

查看:75
本文介绍了联系人提取花费太多时间的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在我的代码中,联系人获取花费太多时间来获取联系人并显示在应用程序中. 请指导我我做错了什么,我应该纠正什么,以缩短执行时间.

In my code the contact fetching takes too much time to fetch the contacts and show in the application. Please guide me where i am wrong and what should i correct in order to make execution time fast.

这是我的代码.

ContentResolver cr = getContentResolver();
    Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI, null,
            null, null, null );
    String phone = null;
    List<String> phonenumber = new ArrayList<String>();
    String emailContact = null;
    String emailType = null;
    String image_uri = "";
    Bitmap bitmap = 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));

            image_uri = cur
                    .getString(cur
                            .getColumnIndex(ContactsContract.CommonDataKinds.Phone.PHOTO_URI));
            if (Integer
                    .parseInt(cur.getString(cur
                            .getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0)
            {
                System.out.println("name : " + name + ", ID : " + id);

                Cursor pCur = cr.query(
                        ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
                        null,
                        ContactsContract.CommonDataKinds.Phone.CONTACT_ID
                                + " = ?", new String[]{id}, null);
                Log.e("pCur","dfgfdg  "+pCur.getCount());
                while (pCur.moveToNext())
                {
                        phone = pCur
                                .getString(pCur
                                        .getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
                    // contactid=pCur.getString(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));

                   /* phonenumber.add(pCur
                            .getString(pCur
                                    .getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)));`*/
                   Log.e("phone" ,phone);

                }
                pCur.close();


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

                while (emailCur.moveToNext())
                {
                    emailContact = emailCur
                            .getString(emailCur
                                    .getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA));

                    if(TextUtils.isEmpty(emailContact)||emailContact.equalsIgnoreCase(null)||emailContact.equalsIgnoreCase(""))
                    {
                        emailContact="";

                        Log.e("isEmpty","isEmpty " + emailContact);
                    }

                    else
                    {
                        Log.e("gfdszfg","Email " + emailContact);
                    }
                  /*  emailType = emailCur
                            .getString(emailCur
                                    .getColumnIndex(ContactsContract.CommonDataKinds.Email.TYPE));*/

                    Log.e("gfdszfg","Email " + emailContact);
                }
                emailCur.close();
            }

            if (image_uri != null)
            {
                System.out.println(Uri.parse(image_uri));
                try
                {
                    bitmap = MediaStore.Images.Media
                            .getBitmap(this.getContentResolver(),
                                    Uri.parse(image_uri));
                    System.out.println(bitmap);

                } catch (FileNotFoundException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }

            mList.add(new Contacts(name, phone, image_uri,emailContact));
            emailContact="";
        }
        cur.close();
        mMyContactsAdapter = new MyContactsAdapter(MainActivity.this, mList);
        mcontact.setAdapter(mMyContactsAdapter);
    }

在我的代码中,还有更多信息是我的联系人在循环循环3次时获取的,我不知道为什么.

and more over in my code my contact fetching while loop is looping 3 times i dont know why.

推荐答案

正如您现在所面对的那样,我已经遇到了这种情况.尝试以下代码

I have faced this situation as you are in right now. Try below 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;
    }
}

肯定会帮助您.

这篇关于联系人提取花费太多时间的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆