Android 号码查询性能优化

简介: 我的需求是做一个快速拨号界面!list列表显示所有联系人Calllog资料!原来的做法在前面的日志中有提到!大概是先查 Cursor phoneCursor = this.managedQuery( ContactsContract.
我的需求是做一个快速拨号界面!list列表显示所有联系人Calllog资料!原来的做法在前面的日志中有提到!大概是先查
Cursor phoneCursor = this.managedQuery(
				ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null,
				null, null);

再根据号码来查联系人
if(0 < phoneCursor.getCount()){
		phoneCursor.moveToFirst();

		// find all contact list
		while (phoneCursor.getPosition() != phoneCursor.getCount()) {
			ContactEntity contactentity = new ContactEntity();
			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(
									"-", "");

			Uri uri = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI,
				            contactentity.contact_id);
			InputStream input = ContactsContract.Contacts.openContactPhotoInputStream(getContentResolver(), uri);
			if(null != input){
			contactentity.contact_phone_bmp = BitmapFactory.decodeStream(input);
			}

			// spell name can
			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查询出来
那么把原来的

private final static String[] mContactsProjection = new String[] {
			ContactsContract.CommonDataKinds.Phone.CONTACT_ID,
			ContactsContract.CommonDataKinds.Phone.TYPE,
			ContactsContract.CommonDataKinds.Phone.NUMBER,
			
	};


改为
private final static String[] mContactsProjection = new String[] {
			ContactsContract.CommonDataKinds.Phone.CONTACT_ID,
			ContactsContract.CommonDataKinds.Phone.TYPE,
			ContactsContract.CommonDataKinds.Phone.NUMBER,
			ContactsContract.Contacts.DISPLAY_NAME,
			ContactsContract.Contacts.PHOTO_ID
	};


下面对应改为
while (phoneCursor.getPosition() != phoneCursor.getCount()) {
				ContactEntity contactentity = new ContactEntity();
				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);
				// spell name can
				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方法中直接赋值而不通过对象传递!
目录
相关文章
|
12天前
|
Java Android开发 iOS开发
深入探讨移动操作系统的性能优化:安卓与iOS的对比分析
在现代移动设备中,操作系统的性能优化至关重要。本文从系统架构、内存管理、电池续航和应用程序运行效率等多个维度,深入探讨了安卓(Android)和iOS两大主流移动操作系统的优化策略及其实际效果,旨在为开发者和用户提供更清晰的了解和选择依据。
22 0
|
3天前
|
缓存 JSON 网络协议
Android面试题:App性能优化之电量优化和网络优化
这篇文章讨论了Android应用的电量和网络优化。电量优化涉及Doze和Standby模式,其中应用可能需要通过用户白名单或电池广播来适应限制。Battery Historian和Android Studio的Energy Profile是电量分析工具。建议减少不必要的操作,延迟非关键任务,合并网络请求。网络优化包括HTTPDNS减少DNS解析延迟,Keep-Alive复用连接,HTTP/2实现多路复用,以及使用protobuf和gzip压缩数据。其他策略如使用WebP图像格式,按网络质量提供不同分辨率的图片,以及启用HTTP缓存也是有效手段。
22 9
|
4天前
|
XML 监控 安全
Android App性能优化之卡顿监控和卡顿优化
本文探讨了Android应用的卡顿优化,重点在于布局优化。建议包括将耗时操作移到后台、使用ViewPager2实现懒加载、减少布局嵌套并利用merge标签、使用ViewStub减少资源消耗,以及通过Layout Inspector和GPU过度绘制检测来优化。推荐使用AsyncLayoutInflater异步加载布局,但需注意线程安全和不支持特性。卡顿监控方面,提到了通过Looper、ChoreographerHelper、adb命令及第三方工具如systrace和BlockCanary。总结了Choreographer基于掉帧计算和BlockCanary基于Looper监控的原理。
15 3
|
2天前
|
Java Android开发 Kotlin
Android面试题:App性能优化之Java和Kotlin常见的数据结构
Java数据结构摘要:ArrayList基于数组,适合查找和修改;LinkedList适合插入删除;HashMap1.8后用数组+链表/红黑树,初始化时预估容量可避免扩容。SparseArray优化查找,ArrayMap减少冲突。 Kotlin优化摘要:Kotlin的List用`listOf/mutableListOf`,Map用`mapOf/mutableMapOf`,支持操作符重载和扩展函数。序列提供懒加载,解构用于遍历Map,扩展函数默认参数增强灵活性。
10 0
|
26天前
|
编解码 缓存 数据库
构建高效Android应用:从性能优化到用户体验
【5月更文挑战第29天】 在移动开发领域,打造一个流畅且响应迅速的Android应用对于保持用户忠诚度和市场份额至关重要。本文将深入探讨如何通过细致的性能优化措施和关注用户体验设计,来提升Android应用的整体质量。我们将透过代码层面的实践技巧、资源管理和系统机制的优化,以及用户界面和交互设计的改良,共同构建起一个既快速又吸引人的应用程序。
|
3天前
|
Java Android开发
Android性能优化:直播推流使用对象池
Android性能优化:直播推流使用对象池
5 0
|
29天前
|
Android开发
【苹果安卓通用】xlsx 和 vCard 文件转换器,txt转vCard文件格式,CSV转 vCard格式,如何批量号码导入手机通讯录,一篇文章说全
本文介绍了如何快速将批量号码导入手机通讯录,适用于企业客户管理、营销团队、活动组织、团队协作和新员工入职等场景。步骤包括:1) 下载软件,提供腾讯云盘和百度网盘链接;2) 打开软件,复制粘贴号码并进行加载预览和制作文件;3) 将制作好的文件通过QQ或微信发送至手机,然后按苹果、安卓或鸿蒙系统的指示导入。整个过程简便快捷,可在1分钟内完成。
|
26天前
|
存储 缓存 Java
安卓应用性能优化实战
【5月更文挑战第29天】随着智能手机的普及,移动应用已成为人们日常生活中不可或缺的一部分。在众多操作系统中,安卓系统以其开放性和灵活性占据了大量的市场份额。然而,应用的性能问题却时常影响着用户体验。本文将深入探讨针对安卓平台进行应用性能优化的策略与实践,从内存管理到多线程处理,再到布局渲染,旨在为开发者提供全面的优化指导,以期打造出更流畅、高效的安卓应用。
|
30天前
|
编解码 缓存 Android开发
安卓应用性能优化实践
【5月更文挑战第25天】 在移动开发领域,随着用户对应用响应速度和流畅度要求的不断提高,安卓应用的性能优化已成为开发者不可忽视的重要课题。本文将深入探讨针对安卓平台进行性能优化的策略与实战技巧,包括内存管理、多线程应用、UI渲染效率提升以及电池使用效率优化等方面。通过分析常见的性能瓶颈并提供相应的解决方案,旨在帮助开发者构建更加高效、流畅的安卓应用。
|
28天前
|
Android开发 开发者 UED
安卓应用开发中的性能优化技巧
在当今移动应用市场竞争激烈的环境中,用户对于应用性能的需求日益增加。因此,在安卓应用开发过程中,如何实现高效的性能优化成为开发者需要关注的重要问题。本文将探讨安卓应用开发中的性能优化技巧,包括减少内存占用、优化界面渲染、提升响应速度等方面的方法,帮助开发者更好地提升应用的用户体验。
22 0