Android使用CursorLoader加载手机联系人

来源:互联网 发布:mac系统多大 编辑:程序博客网 时间:2024/04/30 19:44

1、Loader简介

Loader是Android3.0(API版本11)中引入的一个抽象类,它主要是封装用来进行异步加载数据。Loader的直接子类是AsyncTaskLoader,也就是AsyncTask和Loader的一个封装类,关于AsyncTask这里就不举例了,总之就是异步加载数据,实际上和Thread+Hander+Loader都一样的效果。而CursorLoader是AsyncTaskLoader的子类,主要用来异步查询ContentProvider中的Cursor,比起直接查询速度要快很多。

2、CursorLoader的使用

CursorLoader可以用来加载ContentProvider里的数据,以回调的形式返回数据,这里我们以加载手机通讯录的联系人为例。(ContentProvider请自行查询资料学习)

第一步:权限

读取手机联系人需要以在Manifest中加入下权限

<uses-permission android:name="android.permission.READ_CONTACTS"/>
<uses-permission android:name="android.permission.WRITE_CONTACTS"/>

第二步:实现回调接口

private class TestLoaderCallback implements LoaderManager.LoaderCallbacks<Cursor> {        @Override        public Loader<Cursor> onCreateLoader(int id, Bundle args) {            /**             * 这里返回执行查询的Loader对象,传入的参数和ContentResolver的执行的参数是一样的             */            return new CursorLoader(mContext, ContactsContract.CommonDataKinds.Phone                    .CONTENT_URI, null, null, null, null);        }        @Override        public void onLoadFinished(Loader<Cursor> loader, Cursor data) {            /**             *  加载完成时的回调             *  回调在子线程中,不可以进行UI相关的操作             */            if (null != data) {                while (data.moveToNext()) {                    // 获取备注名                    String name = data.getString(data.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));                    // 获取电话号码                    String phone = data.getString(data.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));                    // 其他的常量自行查询文档                }                runOnUiThread(new Runnable() {                    @Override                    public void run() {                        // 更新UI操作                    }                });            }        }        @Override        public void onLoaderReset(Loader<Cursor> loader) {            /**             * 当LoaderManager重置Loader时回调,子线程             * 可以在这里释放一些查询数据的引用,不用关闭Cursor,LoaderManager会自动关闭             */        }

第三步:执行查询操作

LoaderManager manager = getSupportLoaderManager();// 此处的第一二个参数和Callback中onCreateLoader的值对应,可以传一些查询条件等 // 第二个为刚刚的回调类实例manager.initLoader(id, bundle, callback);

好了,到此查询操作就完成了,这只是其中一个例子,其他的诸如系统音乐视屏文件、短信、通话记录等的查询可以自行尝试。






原创粉丝点击