【问题标题】:Effective way to load contacts with image in android在android中加载带有图像的联系人的有效方法
【发布时间】:2014-08-15 11:57:47
【问题描述】:

我有以下代码来加载所有联系人及其图片

public static void getAllContactWithNumberAndNameAndPhoto(Context context,
            ArrayList<ContactInfo> mContactList, boolean starred) {

        ContentResolver cr = context.getContentResolver();

        Cursor cur = null;
        if (starred == true) {
            cur = cr.query(ContactsContract.Contacts.CONTENT_URI, null,
                    "starred=?", new String[] { "1" }, null);
        } else {

            cur = cr.query(ContactsContract.Contacts.CONTENT_URI, null, null,
                    null, null);
        }
        if (cur.getCount() > 0) {
            while (cur.moveToNext()) {

                ContactInfo item = new ContactInfo();
                String id = cur.getString(cur
                        .getColumnIndex(ContactsContract.Contacts._ID));
                String name = cur
                        .getString(cur
                                .getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
                // Uri photo = PhoneUtils.getPhotoUriFromID(context, id);
                String starredValue = cur.getString(cur
                        .getColumnIndex(ContactsContract.Contacts.STARRED));
                boolean isFav = false;
                if (starredValue.equals("1"))
                    isFav = true;

                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()) {

                        String phoneNo = pCur
                                .getString(pCur
                                        .getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
                        item.addPhone(removeCharactersFromPhoneNumber(phoneNo));
                    }
                    pCur.close();

                    // if (photo != null) {
                    //
                    // item.setPhoto(photo.toString());
                    // }

                    item.setName(name);
                    item.setFavorite(isFav);
                    item.setRecent(false);

                    mContactList.add(item);
                }
            }
            cur.close();
        }
    }

和下面的代码加载联系人图片Uri

public static Uri getPhotoUriFromID(Context context, String id) {
        try {
            Cursor cur = context
                    .getContentResolver()
                    .query(ContactsContract.Data.CONTENT_URI,
                            null,
                            ContactsContract.Data.CONTACT_ID
                                    + "="
                                    + id
                                    + " AND "
                                    + ContactsContract.Data.MIMETYPE
                                    + "='"
                                    + ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE
                                    + "'", null, null);
            if (cur != null) {
                if (!cur.moveToFirst()) {
                    return null;
                }
            } else {
                return null;
            }
            cur.close();
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
        Uri person = ContentUris.withAppendedId(
                ContactsContract.Contacts.CONTENT_URI, Long.parseLong(id));
        return Uri.withAppendedPath(person,
                ContactsContract.Contacts.Photo.CONTENT_DIRECTORY);
    }

一切正常,但对于 1000 个联系人来说,大约 40 秒太慢了,当我评论加载图像的部分时它需要 18 秒,所以我如何在加载联系人的同一查询中加载图像 uri 以最大限度地减少等待时间的用户。

【问题讨论】:

  • 您是否尝试加载缩略图?

标签: java android uri android-contentprovider android-contacts


【解决方案1】:

要显示联系人的图像,您可以使用Universal Image Loader 库。它非常适合处理多个图像。您可以使用默认图像最初显示,一旦加载联系人的图像,库就会显示该图像。

这是您在这个库中显示图像的方式:

ImageLoader.getInstance().displayImage(img, imageView, options);

其中 img 是图片,imageView 是要显示该图片的 ImageView,options 是 UniversalImageLoader 库的 DisplayImageOptions 的对象。

【讨论】:

  • 我的问题不在于图像本身的加载,我的问题在于从联系人数据库中检索照片 uri
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-18
  • 2014-03-13
  • 2019-06-03
  • 1970-01-01
相关资源
最近更新 更多