Android AsyncQueryHandler获取手机联系人实战教程
196 浏览量
更新于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的异步编程最佳实践。
weixin_38703823
- 粉丝: 6
- 资源: 939
最新资源
- katarina
- conflict-practice-debbiev123:让我们解决一些冲突
- warrio:warr.io 的投资组合网站
- Amplifyapp
- Kaue-G:关于我
- conflict-practice-arnitha-b:让我们解决一些冲突
- 行业文档-设计装置-一种切纸机高精度定位装置.zip
- CordovaIonicMobileFirst:我的演示文稿的回购-等待-Cordova和Ionic和MobileFirst
- 基于Mixare,使用OpenGL重写了Mixare的算法。.zip
- STM32编程实现直流有刷电机位置速度电流三闭环PID控制.zip
- decimal-to-roman-converter
- trailer-marvel:Aqui se passa a ordem dos filmes da marvel e junto os预告片
- 前端基础在线2021年1月
- 移远4G网络模块开发设计资料
- ngtrumbitta-services-lodash:将Lodash注入任何Angular应用程序中,并通过旧的_处理程序使用它
- 基于react+parcel和vue+webpack的通用领卷系统.zip