媒体图库

一、拿取资源
当我们要拿取手机的图片时,怎么办?
安卓自带的程序会扫描SD卡,找出所有的图片,并用数据表来维护这些信息,所以我们只需要查这张表就能得到所有的图片信息。

就是这个程序:
这里写图片描述

表中用到的字段:
这里写图片描述

这里写图片描述

注意:在安卓老版本之前(貌似是2.3.3),这张表里面是没有width和height的。

要查这张表需要知道它的uri:MediaStore.Images.Media.EXTERNAL_CONTENT_URI。
MediaStore:媒体库;
Images:图片。可能的选项还有音频和视频等;
Media:媒体文件。还可以选缩略图等;
EXTERNAL_CONTENT_URI:相对应的是内部内容,一个是系统自带的内容,一个外部加进去的。


二、制作图库
你可能需要考虑如下问题:

1、缩小图片:高清大图加载到内存没必要,还会造成OOM

BitmapFactory.Options opts = new BitmapFactory.Options();
opts.inSampleSize = 2;
Bitmap bm = BitmapFactory.decodeFile(image.getPath(), opts);

2、获得图片的宽高(px)

// 解码时的参数
BitmapFactory.Options opts = new BitmapFactory.Options();
// 设置模拟解码图片,尝试获取图片尺寸
opts.inJustDecodeBounds = true;
BitmapFactory.decodeFile(image.getPath(), opts);//模拟加载图片,它不会真的将图片加载进内存,所以它的返回值一定是null,但是它可以读出原图片的宽高,放进BitmapFactory.Options 
int imageWidth = opts.outWidth;
int imageHeight = opts.outHeight;
// 取消模拟解码图片
opts.inJustDecodeBounds = false;

3、重复加载图片的思考(如果你不做缓存):虽然是小图,但是反复的getView()会重复的加载图片,来回滑动很多次时,会不会OOM?其实不会,因为bitmap是局部变量,当它滑出屏幕时就已经是垃圾了,在一定的时机会被GC回收。除非是你快速的滑动,此时GC还没来得及回收。

4、图片的缓存:其实你没必要每次都重新加载图片,之前已经加载过的图片没有道理要被再加载一次,而应该是直接拿来用。建议将bitmap对象缓存在图片对象中。

5、开启线程:加载图片是一个耗时操作,不应该放在主线程。

6、线程的处理:如果同时开启多个线程加载图片的话,过于消耗CPU资源,会造成卡顿。所以我们用AsyncTask只开启一个线程串行的执行任务。

7、AsyncTask的问题:1个屏幕能显示15张图片,也就是说一开始就有15个任务等着执行,这时滑到第16张图片,也就是将第16个任务加入任务队列,此时立刻滑到第一面再滑到第16张图,由于原来的第16个任务并没有完成,所以会将加载第16张图片再作为一个任务加入任务队列(因为是根据图片有没有加载出来作为是否要添加任务的依据的),也就是说为了加载第16张图片添加了两次任务(第16个任务和第17个任务),这是不应该的。解决办法就是:第二次加载第16张图片时将第一次加载的任务先取消。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值