Android AsyncQueryHandler获取手机联系人实战教程

0 下载量 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的异步编程最佳实践。