Bitmap的加载和Cache

根据《android开发艺术探索》做的笔记

BitchmapFactory提供了几个加载方法:decodeFile、decodeResource、decodeStream、decodeByteArray分别从文件系统、资源、输入流、字节数组加载一个Bitmap对象,其中decodeFile、decodeResource都是间接的调用了decodeStream。

如何有效的加载Bitmap呢?就是采用BitmapFactory.Options来加载所需尺寸的图片。他可以对图片进行一定的采样缩小图片。

如何获得采样率呢?需要经过下列的四个步骤,首先将BitmapFactory.Options的inJustDecodeBounds参数设为true,然后再从BitmapFactory.Options取出原始宽高,然后根据采样率的规则并结合目标View的所需大小计算出采样率onSampleSize,最后将inJustDecodeBounds参数设为false。这儿为什么要把inJustDecodeBounds设来设去呢?因为那样的话,BitmapFactory并不会真正的去加载图片,智慧解析图片的原始宽高,所以这个操作是轻量级的。

先介绍一下java的四种引用:

强引用:最普遍的一种引用,如果一个对象具有强引用,那垃圾回收器绝不会回收它。当内存空间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足的问题

软引用:如果一个对象只具有软引用,则内存空间足够,垃圾回收器就不会回收它;如果内存空间不足了,就会回收这些对象的内存。只要垃圾回收器没有回收它,该对象就可以被程序使用。软引用可用来实现内存敏感的高速缓存。

软引用可以和一个引用队列(ReferenceQueue)联合使用,如果软引用所引用的对象被垃圾回收器回收,Java虚拟机就会把这个软引用加入到与之关联的引用队列中

弱引用:在垃圾回收器线程扫描它所管辖的内存区域的过程中,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存。不过,由于垃圾回收器是一个优先级很低的线程,因此不一定会很快发现那些只具有弱引用的对象。

弱引用可以和一个引用队列(ReferenceQueue)联合使用,如果弱引用所引用的对象被垃圾回收,Java虚拟机就会把这个弱引用加入到与之关联的引用队列中。

虚引用:顾名思义,就是形同虚设,与其他几种引用都不同,虚引用并不会决定对象的生命周期。如果一个对象仅持有虚引用,那么它就和没有任何引用一样,在任何时候都可能被垃圾回收器回收

虚引用主要用来跟踪对象被垃圾回收器回收的活动。虚引用与软引用和弱引用的一个区别在于:虚引用必须和引用队列 (ReferenceQueue)联合使用。当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会在回收对象的内存之前,把这个虚引用加入到与之 关联的引用队列中。

LruCache的底层实现就是 LinkedHashMap。

DiskLruCache:1先通过DiskLruCache.open创建一个实例 2将url转化成key,因为url 中有一些字符不能辨认 3 通过edit方法获得一个Editor实例,然后通过Editor就可以获得outputStream 4 将从网上下载的资源通过outputStream写进流里面 5 然后通过editor.commit()写进文件里面。

你可能感兴趣的:(Bitmap的加载和Cache)