概述
如果我们需要得到本机的所有图片,该怎么做?第一反应就是ContentProvider,android提供了本地资源的URI,其中图片的URI是
MediaStore.Images.Media.EXTERNAL_CONTENT_URI。
但是直接使用ContentProvider有两点不方便,第一是我们需要开一个线程执行,因为如果本地图片很多就会很耗时,容易发生ANR,第二就是每次需要图片都要查询一次,很麻烦。
那怎么办呢?别急,android给我们提供了Loader,提供了异步加载数据、跟踪数据自动更新的功能,可以从文件,数据库,ContentProvider获取数据,具体使用方法详见http://blog.csdn.net/niu_gao/article/details/7244117。
加载本地图片
首先写我们的Callback,代码如下
public class MyCallback implements LoaderManager.LoaderCallbacks<Cursor> {
private Context context;
public MyCallback(Context context) {
this.context = context;
}
@Override
public android.content.Loader<Cursor> onCreateLoader(int id, Bundle args) {
return new CursorLoader(context, MediaStore.Images.Media.EXTERNAL_CONTENT_URI, null,
MediaStore.Images.Media.MIME_TYPE + "=? or " + MediaStore.Images.Media.MIME_TYPE + "=?",
new String[] {"image/jpeg", "image/png"},
MediaStore.Images.Media.DATE_MODIFIED
);
}
/**
* 数据加载完毕 或者 数据更新的时候调用
* @param loader
* @param data
*/
@Override
public void onLoadFinished(android.content.Loader<Cursor> loader, Cursor data) {
if (data == null) {
return;
}
// 在这里进行数据的查询,可以将结果通过接口的形式返回
}
@Override
public void onLoaderReset(android.content.Loader<Cursor> loader) {
}
}
在onCreateLoader中我们返回的是CursorLoader且范型声明为Cursor,这样我们就可以使用ComtentProvider查询数据了,可以看出CursorLoader的构造函数和ContentProvider的query很相似。
然后我们初始化
loaderManager.initLoader(0, null, new MyCallback(context));