Android 加载图片优化(二) LruCache DiskLruCache

LruCache(内存缓存)

DiskLruCache(磁盘缓存)

1.创建diskLruCache 对象

private static DiskLruCache diskLruCache = DiskLruCache.open(cacheDir, appVersion, valueCount, DISK_CACHE_SIZE);

  cacheDir  数据缓存目录

  appVersion 当前软件的版本号  一般为1

  valueCount 一个key可以保存多少个文件  一般为1

  DISK_CACHE_SIZE 磁盘的缓存地址

2.cacheDir 获取缓存目录

private File getDiskCacheDir(){
        String cachePath = Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())||
                !Environment.isExternalStorageRemovable()?context.getExternalCacheDir().getPath()
                :context.getCacheDir().getPath();
        Log.i("getDiskCacheDir",cachePath+File.separator+DISK_CACHE_SUBDIR);
        return new File(cachePath+File.separator+DISK_CACHE_SUBDIR);
    }

File cacheDir = getDiskCacheDir();

3.将下载地址用md5加密避免特殊字符 然后作为缓存的key 并且得到DiskLruCache.Editor实例

String imageUrl = "http://10.2.2.1/img.jpg";
String key = hashKeyForDisk(imageUrl);
DiskLruCache.Editor editor = mDiskLruCache.edit(key);

4.通过DiskLruCache.Editor的实例,调用它的newOutputStream()方法来创建一个输出流,并把它传入到downloadUrlToStream()中就能实现下载并写入缓存的功能了。

注意newOutputStream()方法接收一个index参数,由于前面在设置valueCount的时候指定的是1,所以这里index传0就可以了。在写入操作执行完之后,我们还需要调用一下commit()方法进行提交才能使写入生效,调用abort()方法的话则表示放弃此次写入。

new Thread(new Runnable() {
    @Override
    public void run() {
        try {
            String imageUrl = "http://10.2.2.1/img.jpg";
            String key = hashKeyForDisk(imageUrl);
            DiskLruCache.Editor editor = mDiskLruCache.edit(key);
            if (editor != null) {
                OutputStream outputStream = editor.newOutputStream(0);
                if (downloadUrlToStream(imageUrl, outputStream)) {
                    editor.commit();
                } else {
                    editor.abort();
                }
            }
            mDiskLruCache.flush();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}).start();  
时间: 2024-08-09 02:19:13

Android 加载图片优化(二) LruCache DiskLruCache的相关文章

RecyclerView使用 及 滑动时加载图片优化方案

RecyclerView使用 及 滑动时加载图片优化方案 简述 本篇博文主要给大家分享关于RecyclerView控件的使用及通过继承RecyclerView来实现滑动时加载图片的优化方案,也同样能解决防止图片乱序的问题,之前有在网上有看到大神对Android中ListView异步加载图片乱序问题进行过分析,并深入剖析原理后分别给出了3种对应的解决方案:一 .使用findViewWithTag.二.使用弱引用关联.三.使用Volley框架提供的NetworkImageView. 看了之后思索了很

BitmapFactory.Options解决Android加载图片内存溢出的问题

BitmapFactory.Options解决Android加载图片内存溢出的问题 1. 在Android软件开发过程中,图片处理是经常遇到的. 在将图片转换成Bitmap的时候,由于图片的大小不一样,当遇到很大的图片的时候会出现超出内存的问题,为了解决这个问题Android API提供了BitmapFactory.Options这个类. 2. 由于Android对图片使用内存有限制,若是加载几兆的大图片便内存溢出.Bitmap会将图片的所有像素(即长x宽)加载到内存中,如果图片分辨率过大,会直

Android 异步加载图片,使用LruCache和SD卡或手机缓存,效果非常的流畅

转载请注明出处http://blog.csdn.net/xiaanming/article/details/9825113 异步加载图片的例子,网上也比较多,大部分用了HashMap<String, SoftReference<Drawable>> imageCache ,但是现在已经不再推荐使用这种方式了,因为从 Android 2.3 (API Level 9)开始,垃圾回收器会更倾向于回收持有软引用或弱引用的对象,这让软引用和弱引用变得不再可靠.另外,Android 3.0

android 加载图片oom若干方案小结

本文根据网上提供的一些技术方案加上自己实际开发中遇到的情况小结. 众所周知,每个Android应用程序在运行时都有一定的内存限制,限制大小一般为16MB或24MB(视手机而定).一般我们可以通过获取当前线程的可运行内存来判断,比如系统分给当前运行内存只有16M,而你的图片就有16M,这肯定会oom的. 相关知识介绍 1.颜色模型 常见的颜色模型有RGB.YUV.CMYK等,在大多数图像API中采用的都是RGB模型,Android也是如此:另外,在Android中还有包含透明度Alpha的颜色模型

Android加载图片导致内存溢出(Out of Memory异常)

Android在加载大背景图或者大量图片时,经常导致内存溢出(Out of Memory  Error),本文根据我处理这些问题的经历及其它开发者的经验,整理解决方案如下(部分代码及文字出处无法考证):  方案一.读取图片时注意方法的调用,适当压缩  尽量不要使用setImageBitmap或setImageResource或BitmapFactory.decodeResource来设置一张大图,因为这些函数在完成decode后,最终都是通过java层的createBitmap来完成的,需要消耗

图片--Android加载图片导致内存溢出(Out of Memory异常)

Android在加载大背景图或者大量图片时,经常导致内存溢出(Out of Memory  Error),本文根据我处理这些问题的经历及其它开发者的经验,整理解决方案如下(部分代码及文字出处无法考证):  方案一.读取图片时注意方法的调用,适当压缩  尽量不要使用setImageBitmap或setImageResource或BitmapFactory.decodeResource来设置一张大图,因为这些函数在完成decode后,最终都是通过java层的createBitmap来完成的,需要消耗

Android加载图片你必须知道的技巧

学习如何处理和加载Bitmap,显示在UI上非常的重要.如果你不重视这块,Bitmap讲很快耗尽你的内存资源,最终导致oom内存溢出. 移动设备的内存资源很稀缺,很多时候每个应用只能分配到16MB的内存空间.部分机型可能分配的会更多,但是我们必须保证不超过最大内存的限制. Bitmaps本身就非常占用资源.比如一个Galaxy Nexus拍一张照片2592x1936分辨率.如果使用ARGB_8888(2.3版本以后默认值)加载bitmap的话,加载这张图将耗费将近19MB(2592*1936*4

android加载速度优化,通过项目的优化过程分析

通过这么长时间的盒子开发以及之前手机项目的经验,总体感觉两种不同设备还是有很多不同的地方的,首先一点不同的就是,手机项目和电视项目默认启动页面加载速度有重要区别 对于手机:手机加载网络数据,由于屏幕小,如果主页有网络图片的情况下,基本都是显示默认图片,这也是由于网速的限制,更重要的是手机上基本是图文混排,用户没看到图片可能焦点就在文本上了. 对于电视:如果应用首页加载使用默认图,会感觉特别丑,因为屏幕大,重要信息都是图片,如果没有图片,那用户看到的都是空白,用户的焦点没有了,只有等待和抱怨. 因

专为Android加载图片Fresco:详细图解SimpleDraweeView加载图片基础

Fresco简单的使用—SimpleDraweeView 百学须先立志—学前须知: 在我们平时加载图片(不管是下载还是加载本地图片…..)的时候,我们经常会遇到这样一个需求,那就是当图片正在加载时应该呈现正在加载时的图像,当图片 加载失败时应该呈现图片加载时的图像,当我们重新加载这张图片时,应该呈现重试时图像,直到这张图片加载完成.这些繁琐并且重复的如果得不到简化的话,那 将是一个开发人员的噩梦,现在好了,我们用 Facebook 出品的一个强大的图片加载组件 Fresco 几行代码就可以搞定以