Android AsyncQueryHandler获取手机联系人实战教程
104 浏览量
更新于2024-08-28
收藏 49KB PDF 举报
本文主要介绍了如何在Android应用中使用AsyncQueryHandler异步处理来获取手机联系人的方法,以此提升用户体验并简化代码。
在Android开发中,获取设备上的联系人信息通常是一个耗时的操作,如果在主线程中执行,可能会导致应用出现卡顿,影响用户体验。为了解决这个问题,Android提供了AsyncQueryHandler类,它允许开发者在后台线程中执行数据库查询,然后在UI线程中更新结果,从而避免阻塞用户界面。
首先,我们需要在布局文件`main.xml`中设置一个按钮,用于触发获取联系人的操作:
```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>
```
这个按钮的`id`被设为`bt_getCantacts`,点击后将触发获取联系人的操作。
接着,我们创建一个`Contact`类,用于存储联系人的属性,如`contactId`、`displayName`、`phoneNum`等:
```java
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; // 姓名对应的汉语拼音
// getters and setters...
}
```
当用户点击按钮时,我们需要在Activity或Fragment中实例化AsyncQueryHandler,并重写其`onQueryComplete`方法来处理查询结果。以下是一个简单的示例:
```java
public class MainActivity extends AppCompatActivity {
private AsyncQueryHandler asyncQueryHandler;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
asyncQueryHandler = new AsyncQueryHandler(getContentResolver()) {
@Override
protected void onQueryComplete(int token, Object cookie, Cursor cursor) {
if (cursor != null && cursor.getCount() > 0) {
List<Contact> contacts = new ArrayList<>();
while (cursor.moveToNext()) {
Contact contact = new Contact();
// 使用cursor的数据填充Contact对象
// ...
contacts.add(contact);
}
// 在这里处理获取到的联系人列表,例如显示在ListView或RecyclerView中
// ...
}
if (cursor != null) {
cursor.close();
}
}
};
Button btGetContacts = findViewById(R.id.bt_getCantacts);
btGetContacts.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
asyncQueryHandler.startQuery(0, null, ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null, null);
}
});
}
}
```
在`onClick`事件中,我们调用`startQuery`方法启动异步查询。参数包括:查询的token(用于标识查询)、cookie(可选的自定义数据)、查询的URI(这里是联系人数据的URI)、查询列、筛选条件、排序方式以及查询标志。
在`onQueryComplete`回调中,我们处理返回的Cursor对象,从中提取联系人信息并将其存储在`Contact`对象中。注意在完成操作后要关闭Cursor,以释放资源。
通过这种方式,我们可以利用AsyncQueryHandler优雅地获取和处理手机联系人数据,同时确保UI的流畅性。这种方法不仅提高了应用性能,还遵循了Android的异步编程最佳实践。
2013-01-30 上传
155 浏览量
340 浏览量
4430 浏览量
2556 浏览量
647 浏览量
844 浏览量
643 浏览量
690 浏览量
weixin_38703823
- 粉丝: 6
- 资源: 939
最新资源
- Android圆角进度条控件的设计与应用
- mui框架实现带侧边栏的响应式布局
- Android仿知乎横线直线进度条实现教程
- SSM选课系统实现:Spring+SpringMVC+MyBatis源码剖析
- 使用JavaScript开发的流星待办事项应用
- Google Code Jam 2015竞赛回顾与Java编程实践
- Angular 2与NW.js集成:通过Webpack和Gulp构建环境详解
- OneDayTripPlanner:数字化城市旅游活动规划助手
- TinySTM 轻量级原子操作库的详细介绍与安装指南
- 模拟PHP序列化:JavaScript实现序列化与反序列化技术
- ***进销存系统全面功能介绍与开发指南
- 掌握Clojure命名空间的正确重新加载技巧
- 免费获取VMD模态分解Matlab源代码与案例数据
- BuglyEasyToUnity最新更新优化:简化Unity开发者接入流程
- Android学生俱乐部项目任务2解析与实践
- 掌握Elixir语言构建高效分布式网络爬虫