使用Loader加载本地图片

概述

如果我们需要得到本机的所有图片,该怎么做?第一反应就是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));
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值