Android(安卓)号码查询性能优化
16lz
2021-12-04
Android 号码查询性能优化
Android 我的需求是做一个快速拨号界面!list列表显示所有联系人Calllog资料!原来的做法在前面的日志中有提到!大概是先查Java代码
- CursorphoneCursor=this.managedQuery(
- ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null,null,
- null,null);
再根据号码来查联系人
Java代码
- if(0<phoneCursor.getCount()){
- phoneCursor.moveToFirst();
- //findallcontactlist
- while(phoneCursor.getPosition()!=phoneCursor.getCount()){
- ContactEntitycontactentity=newContactEntity();
- contactentity.contact_id=phoneCursor
- .getLong(phoneCursor
- .getColumnIndex(ContactsContract.CommonDataKinds.Phone.CONTACT_ID));
- contactentity.contacts_phone_type=phoneCursor
- .getInt(phoneCursor
- .getColumnIndex(ContactsContract.CommonDataKinds.Phone.TYPE));
- contactentity.contacts_phone_number=phoneCursor
- .getString(phoneCursor
- .getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)).replace(
- "-","");
- contactCursor=this.managedQuery(
- ContactsContract.Contacts.CONTENT_URI,null,
- ContactsContract.Contacts._ID+"="
- +contactentity.contact_id,null,null);
- contactCursor.moveToFirst();
- contactentity.contacts_display_name=contactCursor
- .getString(contactCursor
- .getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)).replace(
- "-","");
- Uriuri=ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI,
- contactentity.contact_id);
- InputStreaminput=ContactsContract.Contacts.openContactPhotoInputStream(getContentResolver(),uri);
- if(null!=input){
- contactentity.contact_phone_bmp=BitmapFactory.decodeStream(input);
- }
- //spellnamecan
- contactentity.spellName=PinYin.getInstance(this).getPinyinString(
- contactentity.contacts_display_name);
- Log.i(TAG,"contactentity.contact_id:"+contactentity.contact_id
- +"contactentity.contacts_phone_type:"
- +contactentity.contacts_phone_type
- +"contactentity.contacts_phone_number:"
- +contactentity.contacts_phone_number
- +"contactentity.contacts_display_name:"
- +contactentity.contacts_display_name
- +"contactentity.contact_phone_bmp:"
- +contactentity.contact_phone_bmp);
- phoneCursor.moveToNext();
- customArrayList.add(contactentity);
- }
经过测试发现性能消耗主要在这个while循环当中!因为在循环当中在加一个查询数据库操作自然慢!
解决方案:
发现在查询ContactsContract.CommonDataKinds.Phone.CONTENT_URI数据库时其实可以吧
ContactsContract.Contacts.DISPLAY_NAME,
ContactsContract.Contacts.PHOTO_ID查询出来
那么把原来的
Java代码
- privatefinalstaticString[]mContactsProjection=newString[]{
- ContactsContract.CommonDataKinds.Phone.CONTACT_ID,
- ContactsContract.CommonDataKinds.Phone.TYPE,
- ContactsContract.CommonDataKinds.Phone.NUMBER,
- };
改为
Java代码
- privatefinalstaticString[]mContactsProjection=newString[]{
- ContactsContract.CommonDataKinds.Phone.CONTACT_ID,
- ContactsContract.CommonDataKinds.Phone.TYPE,
- ContactsContract.CommonDataKinds.Phone.NUMBER,
- ContactsContract.Contacts.DISPLAY_NAME,
- ContactsContract.Contacts.PHOTO_ID
- };
下面对应改为
Java代码
- while(phoneCursor.getPosition()!=phoneCursor.getCount()){
- ContactEntitycontactentity=newContactEntity();
- contactentity.contacts_id=phoneCursor.getLong(0);
- contactentity.contacts_phone_type=phoneCursor.getInt(1);
- contactentity.contacts_phone_number=phoneCursor.getString(2)
- .replace("-","");
- contactentity.contacts_display_name=phoneCursor.getString(3).replace("-","");
- contactentity.contacts_photo_id=phoneCursor.getString(4);
- //spellnamecan
- contactentity.spellName=PinYin.getInstance(this)
- .getPinyinString(contactentity.contacts_display_name);
- //Log.i(TAG,"contactentity.contact_id:"+
- //contactentity.contact_id
- //+"contactentity.contacts_phone_type:"
- //+contactentity.contacts_phone_type
- //+"contactentity.contacts_phone_number:"
- //+contactentity.contacts_phone_number
- //+"contactentity.contacts_display_name:"
- //+contactentity.contacts_display_name
- //+"contactentity.contact_phone_bmp:"
- //+contactentity.contact_phone_bmp);
- phoneCursor.moveToNext();
- customArrayList.add(contactentity);
- }
- }
这样改变后只读一次数据库!
在1000联系人的情况下耗时打LOG得到不到2000毫秒!
其他优化方向!
1、查询数据库时把managedquerey第二参数projection写时!只查需要的列!不查询全部!
2、在contactentity.contact_id = phoneCursor
.getLong(phoneCursor
.getColumnIndex(ContactsContract.CommonDataKinds.Phone.CONTACT_ID));取值时直接用数组序号0,1,2代替!
3.图片等大数据量数据可放在getview方法中直接赋值而不通过对象传递! 分享到: Ubuntu的root帐号激活| String.replaceAll() 正则表达式
- 2011-01-26 17:21
- 浏览 977
- 评论(2)
- 分类:移动开发
- 相关推荐
评论
2 楼 yelinsen052011-11-23 dwpcny 写道 这样还是慢了 有PhoneLookUp类 是经过高度优化的读取联系人类 楼主可以试试吧你想说的是下面这个吧.. 但你没看懂我的方法..
读取Android系统的通讯录时一般会先读取联系人然后再读取其号码,嵌套循环读取。如果通讯录人数不多速度尚可,但是通讯录里有1-2百人恐怕就比较慢了,如果硬件再差点体验就更差了。可以使用
ContactsContract.CommonDataKinds.Phone.CONTENT_URI(对应contacts2.db的数据视图view_data_restricted)视图来读取避免嵌套读取,而对于PhoneLookup.CONTENT_FILTER_URI确不能直接使用,这里分享一下小技巧。
一、PhoneLookup.CONTENT_FILTER_URI的一般用法
Uri uri = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, Uri.encode(phoneNumber));
resolver.query(uri, new String[]{PhoneLookup.DISPLAY_NAME,...
API见这里。如果直接如下使用PhoneLookup.CONTENT_FILTER_URI会报IllegalArgument Exception错
getContentResolver().query(PhoneLookup.CONTENT_FILTER_URI,...
二、 技巧用法
Cursor c = getContentResolver().query(Uri.withAppendedPath(
PhoneLookup.CONTENT_FILTER_URI, "*"), new String[] {
PhoneLookup._ID,
PhoneLookup.NUMBER,
PhoneLookup.DISPLAY_NAME,
PhoneLookup.TYPE, PhoneLookup.LABEL }, null, null, sortOrder);
关键是这个"*",这样就能取到所有的号码以及相关的联系人的姓名以及其他相关字段,比通过联系人再查找其号码要方便很多。
1 楼 dwpcny2011-11-16 这样还是慢了 有PhoneLookUp类 是经过高度优化的读取联系人类 楼主可以试试吧
更多相关文章
- 从简单的android 登陆应用 ,学习布局,
- android常用数据库字段描述
- Android查看jar包源码问题
- Android移动开发之【Android实战项目】渐变的TextView小漂亮代码
- Android――ViewGroup的一个用法实例(转载)
- android弹出对话框大全
- Android如何调用Google Web Search?
- Android如何调用Google Web Search?
- Android的NDK开发(2)————利用Android(安卓)NDK编写一个简单