最近在做Android通讯录相关开发,需求是获取系统通讯录中所有手机号字段,包括住宅的手机号,还要展示姓名和头像
获取通讯录手机性能低500条数据大概耗时要15s左右,满足不了产品需求,所以要进行优化获取速度。

简单实现:

查询所有手机号要指定URI路径:content://com.android.contacts/phones

速度优化点:

一、查询sql一定要过滤列,500条数据会将时间从15s缩短到5-6s,指定projection字段,我指定了四列,如果你不取头像,可以只取data1和display_name两列
    “contact_id”:contactId,为了按照这个id查询头像URI的数据
    “data1”:手机号
    "display_name":姓名
    "photo_id":头像ID

二、优化头像获取速度
  1、有photo_id字段有数据才查询,没有数据就不用查询了
  2、按照contact_id、mimetype、deleted的查询条件过滤头像
  3、查询出的字节数组直接保存,不要decode成bitmap再保存


总结:

在不做缓存的情况下,500条数据基本1s内就能查询出来。

示例代码:

public static List loadAllContacts(Context context) {
        if (context == null) {
            return null;
        }
        ContentResolver resolver = context.getContentResolver();
        if (resolver == null) {
            return null;
        }
        List dataList = new ArrayList<>();
        String[] projection = new String[]{
                ContactsContract.CommonDataKinds.Phone.CONTACT_ID,
                ContactsContract.CommonDataKinds.Phone.NUMBER,
                ContactsContract.Contacts.DISPLAY_NAME,
                ContactsContract.Contacts.PHOTO_ID
        };
        Cursor cursor = resolver.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
                projection, null, null, null);
        if (cursor == null) {
            return Collections.EMPTY_LIST;
        }
        while (cursor.moveToNext()) {
            int contactId = cursor.getInt(0);
            String phone = cursor.getString(1);
            String name = cursor.getString(2);
            long photoId = cursor.getLong(3);
            byte[] photoBytes = null;
            if (photoId > 0) {
                Cursor cursorPhoto = resolver.query(ContactsContract.RawContactsEntity.CONTENT_URI,
                        new String[]{ContactsContract.CommonDataKinds.Photo.PHOTO},
                        ContactsContract.RawContactsEntity.CONTACT_ID + " = ? and " + ContactsContract.RawContactsEntity.MIMETYPE + " = ? and " + ContactsContract.RawContactsEntity.DELETED + " = ?",
                        new String[]{String.valueOf(contactId), ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE, "0"},
                        null);
                if (cursorPhoto.moveToNext()) {
                    photoBytes = cursorPhoto.getBlob(0);
                }
                cursorPhoto.close();
            } else {
                photoBytes = null;
            }

            ContactInfo contactInfo = new ContactInfo(name, phone, photoBytes);
            dataList.add(contactInfo);
        }
        cursor.close();
        return dataList;
    }

更多相关文章

  1. Android开发之Jsoup解析webView加载数据
  2. 学习笔记之——Android中的Picasso实现圆形头像、圆角图片工具类
  3. Android Fragment内嵌Fragment页面不刷新数据问题
  4. Glide 加载圆形头像和gif 图
  5. android 测试读取LEB数据的函数
  6. android中在切换fragment时,怎样做到无需重复加载数据的方法。
  7. Android 编辑头像功能简单实现实例(图片选取,裁剪)
  8. android发送短信填入手机号码,6.0动态请求权限拨打电话

随机推荐

  1. 研究称87%的Android设备不安全
  2. Android获取数据时 浮点型整数位数值(超8
  3. android audiorecord插上耳机录音由dmic
  4. Android上hook AMS和PMS
  5. Windows下Rk3288替换内核以及Launcher方
  6. Android动态换肤(一、应用内置多套皮肤)
  7. Android实用工具类-GrallyAndPhotoUtils
  8. Android异常捕获篇(下)---retrofit实现文件
  9. Android(安卓)Studio精彩案例(三)《模仿
  10. Android实用视图动画及工具系列之三:表情