利用AsyncQueryHandler能异步任务获取手机联系人,增加用户体验,使用起来也很方便。不多说,上干货。
布局文件main.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" tools:ignore="HardcodedText" > <Button android:id="@+id/bt_getCantacts" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="获取联系人信息" /> </LinearLayout>
contact.java 联系人bean文件
package com.larson.cantact; public class Contact { private int contactId;//联系人ID private String displayName;//联系人姓名 private String phoneNum;//联系人手机号 private String sortKey;//排序Key private Long photoId;//头像ID private String lookUpKey; private int selected = 0;//被选中的行号 private String formattedNumber;//被格式化的号码 private String pinyin;//姓名对应的汉语拼音 public int getContactId() { return contactId; } public void setContactId(int contactId) { this.contactId = contactId; } public String getDisplayName() { return displayName; } public void setDisplayName(String displayName) { this.displayName = displayName; } public String getPhoneNum() { return phoneNum; } public void setPhoneNum(String phoneNum) { this.phoneNum = phoneNum; } public String getSortKey() { return sortKey; } public void setSortKey(String sortKey) { this.sortKey = sortKey; } public Long getPhotoId() { return photoId; } public void setPhotoId(Long photoId) { this.photoId = photoId; } public String getLookUpKey() { return lookUpKey; } public void setLookUpKey(String lookUpKey) { this.lookUpKey = lookUpKey; } public int getSelected() { return selected; } public void setSelected(int selected) { this.selected = selected; } public String getFormattedNumber() { return formattedNumber; } public void setFormattedNumber(String formattedNumber) { this.formattedNumber = formattedNumber; } public String getPinyin() { return pinyin; } public void setPinyin(String pinyin) { this.pinyin = pinyin; } }
MainActivity.java
package com.larson.cantact; import java.util.ArrayList; import android.app.Activity; import android.content.AsyncQueryHandler; import android.content.ContentResolver; import android.database.Cursor; import android.net.Uri; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.provider.ContactsContract; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; public class MainActivity extends Activity { private Button myCantacts; private AsyncQueryHandler asyncQuery; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); myCantacts = (Button) this.findViewById(R.id.bt_getCantacts); myCantacts.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { asyncQuery = new MyAsyncQueryHandler(getContentResolver()); initSQL(); } }); } protected void initSQL() { // 联系人URI Uri uri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI; // 联系人ID,联系人NAME, String[] projection = { ContactsContract.CommonDataKinds.Phone._ID, ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME, ContactsContract.CommonDataKinds.Phone.DATA1, "sort_key", ContactsContract.CommonDataKinds.Phone.CONTACT_ID, }; asyncQuery.startQuery(0, null, uri, projection, null, null, "sort_key COLLATE LOCALIZED asc"); } private class MyAsyncQueryHandler extends AsyncQueryHandler { public MyAsyncQueryHandler(ContentResolver cr) { super(cr); } protected void onQueryComplete(int token, Object cookie, Cursor cursor) { querying(cursor); } } private void querying(final Cursor cursor) { Handler handlerInsertOrder = new Handler() { public void handleMessage(Message msg) { switch (msg.what) { case MyAsyncTask.DOWNLOADING_START_MESSAGE: System.out.println("begin to sort out t9"); break; case MyAsyncTask.DOWNLOAD_END_MESSAGE: Bundle bundle1 = msg.getData(); ArrayList<ContactBean> list = (ArrayList<ContactBean>) bundle1 .get("完成"); for (ContactBean ci : list) { System.out.println(ci.getDisplayName()); System.out.println(ci.getPhoneNum()); System.out.println("--------------------------------"); } break; default: break; } super.handleMessage(msg); } }; MyAsyncTask.startRequestServerData(this, handlerInsertOrder, cursor); } }
自定义的MyAsyncTask.java
package com.anjoyo.cantact; import java.util.ArrayList; import android.content.Context; import android.database.Cursor; import android.os.AsyncTask; import android.os.Bundle; import android.os.Handler; import android.os.Message; public class MyAsyncTask extends AsyncTask<Cursor, Void, ArrayList<ContactBean>> { /** 开始整理 */ public static final int DOWNLOADING_START_MESSAGE = 7; /** 整理结束 */ public static final int DOWNLOAD_END_MESSAGE = 17; private Context mContext = null; private Handler mHandler = null; protected MyAsyncTask(Context context, Handler handler) { this.mContext = context; this.mHandler = handler; } @Override protected void onPreExecute() { sendStartMessage(DOWNLOADING_START_MESSAGE); } @Override protected ArrayList<ContactBean> doInCursor... params) { // 只需要把原来放在子线程的代码放到这个方法就行 Cursor cursor = params[0]; ArrayList<ContactBean> ciList = new ArrayList<ContactBean>(); if (cursor != null && cursor.getCount() > 0) { try { cursor.moveToFirst(); for (int i = 0; i < cursor.getCount(); i++) { cursor.moveToPosition(i); String name = cursor.getString(1); String number = cursor.getString(2); int contactId = cursor.getInt(4); ContactBean contactInfo = new ContactBean(); contactInfo.setContactId(contactId); contactInfo.setPhoneNum(number); contactInfo.setDisplayName(name); if (contactInfo.getDisplayName() == null) { contactInfo.setDisplayName(contactInfo.getPhoneNum()); } ciList.add(contactInfo); } } catch (Exception e) { e.printStackTrace(); } } return ciList; } @Override protected void onPostExecute(ArrayList<ContactBean> result) { sendEndMessage(DOWNLOAD_END_MESSAGE, result); } public static void startRequestServerData(Context context, Handler handler, Cursor cursor) { new MyAsyncTask(context, handler).execute(cursor); } /** * 发送开始整理消息 * * @param messageWhat */ private void sendStartMessage(int messageWhat) { Message message = new Message(); message.what = messageWhat; if (mHandler != null) { mHandler.sendMessage(message); } } /** * 发送整理结束消息 * * @param messageWhat */ private void sendEndMessage(int messageWhat, ArrayList<ContactBean> result) { Message message = new Message(); message.what = messageWhat; Bundle bundle = new Bundle(); bundle.putSerializable("完成", result); message.setData(bundle); if (mHandler != null) { mHandler.sendMessage(message); } } }
小工具,供人参考,方便广大程序员,欢迎指正。
相关推荐
在Android开发中,获取手机联系人信息是一项常见的需求。`AsyncQueryHandler` 是Android系统提供的一种异步处理数据库查询的方法,特别适用于从SQLite数据库中读取大量数据,如手机联系人列表。本篇文章将深入探讨...
本文将详细介绍如何使用`AsyncQueryHandler`实现获取手机联系人的功能。 首先,我们来看一下布局文件`main.xml`。这是一个简单的线性布局,包含一个按钮`bt_getContacts`,用户点击这个按钮时,程序将启动获取联系...
|--内容提供者之联系人读写与批量操作 |--内容提供者之获取通话记录 |--内容提供者的定义 |--写入联系人信息 |--利用FinalHttp实现多线程断点续传 |--加密之MD5 |--动画Animation详解 |--动画之view左右抖动 |--动画...
作者提出利用AsyncQueryHandler异步查询辅助类来获取短信会话列表,避免因长时间阻塞主线程导致的ANR(Application Not Responding)异常。这种异步处理方式可以提高系统的响应速度和用户体验。 在短信显示方面,...
GUI面板MATLAB香烟汉字识别
2023年统招专升本计算机考试真题及答案6.pdf
Java 项目, Java 毕业设计,Java 课程设计,基于 SpringBoot 开发的,含有代码注释,新手也可看懂。毕业设计、期末大作业、课程设计、高分必看,下载下来,简单部署,就可以使用。 包含:项目源码、数据库脚本、软件工具等,前后端代码都在里面。 该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。 项目都经过严格调试,确保可以运行! 1. 技术组成 前端:html、javascript、Vue 后台框架:SpringBoot 开发环境:idea 数据库:MySql(建议用 5.7 版本,8.0 有时候会有坑) 数据库工具:navicat 部署环境:Tomcat(建议用 7.x 或者 8.x 版本), maven 2. 部署 如果部署有疑问的话,可以找我咨询 Java工具包下载地址: https://pan.quark.cn/s/eb24351ebac4 后台路径地址:localhost:8080/项目名称/admin/dist/index.html 前台路径地址:localhost:8080/项目名称/front/index.html (无前台不需要输入)
Java 项目, Java 毕业设计,Java 课程设计,基于 SSM 开发的,含有代码注释,新手也可看懂。毕业设计、期末大作业、课程设计、高分必看,下载下来,简单部署,就可以使用。 包含:项目源码、数据库脚本、软件工具等,前后端代码都在里面。 该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。 项目都经过严格调试,确保可以运行! 1. 技术组成 前端:vue/html5 后台框架:SSM 开发环境:idea 数据库:MySql(建议用 5.7 版本,8.0 有时候会有坑) 数据库工具:navicat 部署环境:Tomcat(建议用 7.x 或者 8.x 版本), maven 2. 部署 如果部署有疑问的话,可以找我咨询 Java工具包下载地址: https://pan.quark.cn/s/eb24351ebac4
Java 项目, Java 毕业设计,Java 课程设计,基于 SpringBoot 开发的,含有代码注释,新手也可看懂。毕业设计、期末大作业、课程设计、高分必看,下载下来,简单部署,就可以使用。 包含:项目源码、数据库脚本、软件工具等,前后端代码都在里面。 该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。 项目都经过严格调试,确保可以运行! 1. 技术组成 前端:html、javascript、Vue 后台框架:SpringBoot 开发环境:idea 数据库:MySql(建议用 5.7 版本,8.0 有时候会有坑) 数据库工具:navicat 部署环境:Tomcat(建议用 7.x 或者 8.x 版本), maven 2. 部署 如果部署有疑问的话,可以找我咨询 Java工具包下载地址: https://pan.quark.cn/s/eb24351ebac4 后台路径地址:localhost:8080/项目名称/admin/dist/index.html 前台路径地址:localhost:8080/项目名称/front/index.html (无前台不需要输入)
MATLAB设计的危险区域预警系统(GUI界面设计)
2023年江苏省计算机二级VB试卷.pdf
NSCBx1.0.1b Keys19.0.0.zip
智慧园区,作为现代化城市发展的新兴模式,正逐步改变着传统园区的运营与管理方式。它并非简单的信息化升级,而是跨越了行业壁垒,实现了数据共享与业务协同的复杂运行系统。在智慧园区的构建中,人们常常陷入一些误区,如认为智慧园区可以速成、与本部门无关或等同于传统信息化。然而,智慧园区的建设需要长期规划与多方参与,它不仅关乎技术层面的革新,更涉及到管理理念的转变。通过打破信息孤岛,智慧园区实现了各系统间的无缝对接,为园区的科学决策提供了有力支持。 智慧园区的核心价值在于其提供的全方位服务与管理能力。从基础设施的智能化改造,如全面光纤接入、4G/5G网络覆盖、Wi-Fi网络及物联网技术的运用,到园区综合管理平台的建设,智慧园区打造了一个高效、便捷、安全的运营环境。在这个平台上,园区管理方可以实时掌握运营动态,包括道路状况、游客数量、设施状态及自然环境等信息,从而实现事件的提前预警与自动调配。同时,智慧园区还为园区企业提供了丰富的服务,如项目申报、资质认定、入园车辆管理及统计分析等,极大地提升了企业的运营效率。此外,智慧园区还注重用户体验,通过信息发布系统、服务门户系统及各类智慧应用,如掌上营销、智慧停车、智能安防等,为园区员工、企业及访客提供了便捷、舒适的生活与工作体验。值得一提的是,智慧园区还充分利用大数据、云计算等先进技术,对园区的能耗数据进行采集、分析与管理,实现了绿色、节能的运营目标。 在智慧园区的建设过程中,还涌现出了许多创新的应用场景。例如,在环境监测方面,智慧园区通过集成各类传感器与监控系统,实现了对园区水质、空气质量的实时监测与预警;在交通管理方面,智慧园区利用物联网技术,对园区观光车、救援车辆等进行实时定位与调度,提高了交通效率与安全性;在公共服务方面,智慧园区通过构建统一的公共服务平台,为园区居民提供了包括平安社区、便民社区、智能家居在内的多元化服务。这些创新应用不仅提升了园区的智能化水平,还为园区的可持续发展奠定了坚实基础。同时,智慧园区的建设也促进了产业链的聚合与发展,通过搭建聚合产业链平台,实现了园区内企业间的资源共享与合作共赢。总的来说,智慧园区的建设不仅提升了园区的综合竞争力,还为城市的智慧化发展树立了典范。它以用户需求为导向,以技术创新为驱动,不断推动着园区向更加智慧、高效、绿色的方向发展。对于写方案的读者而言,智慧园区的成功案例与创新应用无疑提供了宝贵的借鉴与启示,值得深入探索与学习。
一、系统需求分析 1 (一)需求概述 1 (二)业务流分析 1 (三)数据流分析 3 (四)数据字典 3 二、数据库概念结构设计 5 (一)实体分析 5 (二)属性分析 5 (三)联系分析 6 (四)概念模型分析(.PDM图) 7 三、数据库逻辑结构设计 8 (一)概念模型转化为逻辑模型 8 1.一对一关系的转化 8 2.一对多关系的转化 8 3.多对多关系的转化 8 (二)逻辑模型设计(.PDM图) 8 四、数据库物理实现 9 (一)表设计 9 (二)创建表和完整性约束代码设计 10 (三)创建视图、索引、存储过程和触发器 11 五、数据库功能调试 12 (一)职工管理模块 12 (二)工程负责人管理模块 13 (三)系统管理员管理模块 15 六、设计系统前台软件 20 (一)开发软件选择 20 (二)软件功能要求与设计 21 (三)软件功能实现 21 (四)系统测试 27 七、设计总结 28
ava项目springboot基于springboot的课程设计,包含源码+数据库+毕业论文
【人机交互】MATLAB手势识别设计
【工程项目】MATLAB的人脸+指纹融合系统(结合人脸和指纹一致性方可通行)
2023年历年真题考试:管理系统中计算机应用历年真题汇编(共207题).pdf
ava项目springboot基于springboot的课程设计,包含源码+数据库+毕业论文
【人机交互】MATLAB信号与系统数字信号设计