利用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`,用户点击这个按钮时,程序将启动获取联系...
本代码是QuickContactBadge和AsyncQueryHandler实现联系人列表的完美实现,对初级程序员会有很大的帮助,可以直接拿来用,还带了首字母拼音的滑动栏,里面有自定义控件可以让你好好学习
- projection:指定要获取哪些列。 - selection:筛选条件,如果不需要筛选,可以为空字符串。 - selectionArgs:与筛选条件配合使用的参数,如果不需要,可以传null。 - sortOrder:数据排序方式,如果不需要排序,...
总的来说,`AsyncQueryHandler`是Android系统提供的一种简单而有效的异步数据库操作工具,特别适合于简单的查询操作。然而,对于复杂的事务或需要精细控制的场景,开发者可能需要考虑使用其他解决方案,如`...
而`AsyncQueryHandler`是Android系统提供的一个辅助类,用于在ContentProvider中执行异步查询操作,避免阻塞主线程,提升用户体验。这篇博客()可能会详细解析这个帮助类的工作原理和使用方法。 `...
`AsyncQueryHandler` 基于 `AsyncTask`,但使用更简单,尤其适合与 `ContentProvider` 结合使用。使用步骤包括: 1. 创建一个 `AsyncQueryHandler` 的实例,通常在需要执行查询的Activity或Fragment中。 2. 调用 `...
- `mQueryHandler`是`QueryHandler`的实例,它继承自`AsyncQueryHandler`,负责异步查询联系人数据。 - 在`onResume`方法中,会检查是否需要执行查询。如果是在默认模式下,并且是第一次打开应用,会调用`...
|--内容提供者之联系人读写与批量操作 |--内容提供者之获取通话记录 |--内容提供者的定义 |--写入联系人信息 |--利用FinalHttp实现多线程断点续传 |--加密之MD5 |--动画Animation详解 |--动画之view左右抖动 |--动画...
此篇文章聚焦于Android系统中联系人数据的查询机制,尤其是通过代码层面解析这一过程,为开发者提供深入理解与实践指导。 ### Android Contacts查询全过程概述 在Android系统中,联系人数据存储于Content Provider...
作者提出利用AsyncQueryHandler异步查询辅助类来获取短信会话列表,避免因长时间阻塞主线程导致的ANR(Application Not Responding)异常。这种异步处理方式可以提高系统的响应速度和用户体验。 在短信显示方面,...
在Android系统中,QuickSearchBox(QSB)是一个非常重要的组件,它提供了全局搜索功能,允许用户快速查找应用程序内的数据、联系人、网页以及更多其他内容。本篇文章将深入探讨Android-QuickSearchBox程序源码,解析...
这个控件通常用于显示大量需要分类的数据,比如联系人列表。在本文中,我们将深入探讨`AlphabetListView`的工作原理、如何使用以及其与`AsyncQueryHandler`的结合。 ### 1. `AlphabetListView`概述 `...
1. 在`Fragment`中获取用户选择的日历事件ID列表。 2. 使用`AsyncQueryHandler`的`startDelete()`方法,传入ContentResolver、URI(代表日历事件的表)、事件ID列表以及一个操作完成后的回调接口。 3. 在回调接口的`...
他使用AsyncQueryHandler进行异步查询,实现了ListView滑动、联系人自动提示、草稿自动保存等特性。 3. **手机万能播放器**:该应用支持多种音视频格式的本地和在线播放,还具有视频下载和搜索功能。他在项目中负责...
本案例主要探讨了如何使用Android的SQLite数据库,以及与之相关的组件和工具,如ContentProvider、AsyncQueryHandler和SQLiteOpenHelper。以下是这些关键知识点的详细说明。 1. **SQLite数据库**: 安卓系统默认支持...
`Message`可以通过`obtainMessage()`获取,以避免额外的内存分配,也可以手动创建并配置。每个`Handler`实例只能处理由自身`obtainMessage()`或配置为可处理的消息。 `Handler`的发送和接收消息机制保证了消息的...
`Message`是承载数据的对象,可以通过`Handler`的`obtainMessage()`方法获取,或者手动创建并配置。 然而,如果要在其他线程中处理消息,就需要自定义`Looper`。这通常在服务或后台线程中进行,以便在不影响UI线程...
接着,利用`AsyncQueryHandler`发起查询,获取存储设备的信息。`QueryArg` 类用于封装查询的相关参数,如URI、投影列、选择条件等,以便在回调`onQueryComplete()` 中区分不同的查询请求。 2. **安全弹出U盘** 弹...