LruCache和DiskLruCache

LruCache与DiskLruCache的使用 在前面的Bitmap文章中提到,Bitmap在使用中非常容易出现OOM,而本节主要介绍2个方法对加载多图/大图的情况进行优化,有效的避免OOM。 1.LruCache缓存 在使用RecyclerView、ListView等加载多图时,屏幕上显示的图片会通过滑动屏幕等事件不断地增加,最终导致OOM。为了保证内存始终维持在一个合理的范围,当item移除屏幕时要对图片进行回收,重新滚入屏幕时又要重新加载... 阅读详情

//**
 * 三级缓存:
 * 一级缓存:内存缓存
 * 二级缓存:硬盘缓存
 * 三级缓存:网络缓存
 *
 * @author 43497
 * @date 2018/3/15
 */

public class LruCacheUtil {

    /**
     * 内存缓存最大值--设置为可使用的内存的1/8
     * LruCache 如果缓存的大小已经达到了最大值,最近时间最少使用的缓存数据被移除
     */
    private static LruCache<String, Bitmap> mLruCache = new LruCache<String, Bitmap>((int) (Runtime.getRuntime().maxMemory() / 8)) {

        /**
         * 用于计算缓存数据的大小
         * @param key
         * @param bitmap
         * @return
         */
        @Override
        protected int sizeOf(String key, Bitmap bitmap) {
            return bitmap.getRowBytes() * bitmap.getHeight();
        }
    };

    /**
     * 添加缓存
     *
     * @param url
     * @param bitmap
     */
    public static void putCache(String url, Bitmap bitmap) {
        mLruCache.put(url, bitmap);
    }

    /**
     * 获取缓存
     *
     * @param url
     * @return
     */
    public static Bitmap getCache(String url) {
        return mLruCache.get(url);
    }

    /**
     * 移除缓存
     *
     * @param url
     */
    public static void removeCache(String url) {
        if (getCache(url) != null) {
            mLruCache.remove(url);
        }
    }

    /**
     * 清除缓存
     */
    public static void clearCache() {
        if (mLruCache.size() > 0) {
            mLruCache.evictAll();
        }
    }
}
/**
 * 硬盘缓存
 * DiskLruCache
 *
 * 硬盘缓存的位置(该路径会随着App的卸载自动删除掉)
 * 外部存储:getExternalCacheDir()-->SDCard/Android/data/<应用程序包名>/cache
 * 内部存储:getCacheDir()-->data/data/<应用程序包名>/cache
 *
 * @author 43497
 * @date 2018/3/12
 */

public class DiskLruCacheUtil {

    public static DiskLruCache mDiskLruCache;
    private static int maxSize = 1024 * 1024 * 10;

    public static void init(Context context) {
        if (mDiskLruCache != null) {
            try {
                /**
                 * 参数1:磁盘缓存的路径
                 * 参数2:设置App的版本号,版本号升级,则磁盘缓存自动清空
                 * 参数3:表示一个key值最多可以对应多少个value
                 * 参数4:最大可以缓存多少数据
                 */
                mDiskLruCache = DiskLruCache.open(getCacheFile(context, "bitmap"), getAppVersion(context), 1, maxSize);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 写入缓存
     *
     * @param url
     * @param bitmap
     * @return
     */
    public static boolean writeCache(String url, Bitmap bitmap) {
        if (url != null && bitmap != null) {
            DiskLruCache.Editor editor = null;
            try {
                editor = mDiskLruCache.edit(url);
                OutputStream outputStream = editor.newOutputStream(0);
                bitmap.compress(Bitmap.CompressFormat.PNG, 100, outputStream);
                editor.commit();
                return true;
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return false;
    }

    /**
     * 读取缓存
     *
     * @param url
     * @return
     */
    public static Bitmap getCache(String url) {
        if (url != null){
            DiskLruCache.Snapshot snapshot = null;
            try {
                snapshot = mDiskLruCache.get(url);
                if (snapshot != null){
                    InputStream inputStream = snapshot.getInputStream(0);
                    return BitmapFactory.decodeStream(inputStream);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return null;
    }

    /**
     * 清除缓存
     */
    public static void clearCache(){
        try {
            mDiskLruCache.delete();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 同步日志文件
     */
    public static void flushLog(){
        try {
            mDiskLruCache.flush();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 关闭
     */
    public static void close(){
        try {
            mDiskLruCache.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 获取磁盘路径
     *
     * @param context
     * @param endPath
     * @return
     */
    private static File getCacheFile(Context context, String endPath) {
        String cachePath;
        if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
            cachePath = context.getExternalCacheDir().getAbsolutePath();
        } else {
            cachePath = context.getCacheDir().getAbsolutePath();
        }
        File cacheFile = new File(cachePath, endPath);
        if (!cacheFile.exists()) {
            cacheFile.mkdirs();
        }
        return cacheFile;
    }

    private static int getAppVersion(Context context) {
        try {
            PackageInfo packageInfo = context.getPackageManager().getPackageInfo(context.getPackageName(), 0);
            return packageInfo.versionCode;
        } catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
        }
        return 1;
    }
}
Android面试题(22)-lruCache与DiskLruCache缓存详解 关于lruCache(最近最少使用)的算法,这是一个比较重要的算法,它的应用非常广泛,不仅仅在Android中使用,Linux系统等其他地方中也有使用;今天就来看一看这其中的奥秘;讲到LruCache,就不得不讲一讲LinkedHashMap,而对于LinkedHashMap,它继承的是HashMap,那么我们就先从HashMap开始看起吧;注:此篇博客所讲的所有知识都是在jdk1.8环境下的,j... 阅读详情

相关推荐

Android高效图片加载与缓存实践:LruCache与DiskLruCache组合使用

本文还有配套的精品资源,点击获取 简介:本项目演示了如何在Android中利用LruCache和DiskLruCache来优化图片加载过程。LruCache用于内存缓存,而DiskLruCache则用于持久化存储。通过这种双重缓存策略,可显著提升应用性能,减少等待时间,降低系统资源消耗。通过下载并分析 PhotosWallDemo 项目源码,开发者将学习到如何...

weixin_42593549的博客 1027

Android DiskLruCache完全解析,硬盘缓存的最佳方案

Android DiskLruCache完全解析,硬盘缓存的最佳方案

QG 1870

Android缓存之DiskLruCache磁盘缓存的使用

DiskLruCache和LruCache不同的是,LruCache是内存缓存,而DiskLruCache是指磁盘缓存,顾名思义就是把文件缓存到磁盘,也也就是手机的内存卡中。接下来先简单介绍DiskLruCache的使用方法。 下载源码 DiskLruCache并没有在 SDK中存在,但又是谷歌提倡的。所以我们要先把DiskLruCache的源码下载下来。 我们可以通过下面这个地址下载源码:https://github.com/JakeWharton/DiskLruCache/tree/master/src/main/java/com/jakewharton/disklrucache 然后

深入理解Linux文件系统及日志分析 超简单易懂

深入理解Linux文件系统及日志分析一、INODE与BLOCK1.1、inode与block概述1.2、inode的内容二、软连接与硬链接2.1、连接文件三、恢复误删除的文件3.1、EXT类型文件恢复1、下面将介绍使用extundelete工具如何恢复误删除的文件。 一、INODE与BLOCK 1.1、inode与block概述 文件是存储在硬盘上的,硬盘最小存储叫做扇区,每个扇区512字节 操作系统读取硬盘信息,不会一个一个扇区读取。实际情况一下连续读取 多个扇区,一次性读取多个扇区,叫做块(Block)

CNFANG的博客 600

RK3576开发板ROS2部署实战:从Buildroot配置到Hello World Demo

本文详细介绍了在RK3576开发板上部署ROS2的完整实战流程。从Buildroot工程配置、集成ROS2依赖,到搭建Docker交叉编译环境、处理编译难题,最终完成系统镜像打包并在板端成功运行Talker-Listener Demo。该指南旨在帮助开发者深入理解嵌入式机器人系统的构建链,实现从底层到应用的完全掌控。

mac99的博客 1157

保姆级教程:在树莓派5B上用AI Kit跑YOLOv8,实测134fps的完整配置流程

本文提供了一份详细的树莓派5B搭配AI Kit部署YOLOv8的教程,从硬件组装到模型转换、优化和部署,最终实现134FPS的高帧率推理性能。通过Hailo-8L AI加速模块和HEF模型转换,这套方案为边缘AI计算提供了强大支持,适用于智能监控、无人机视觉导航等应用场景。

weixin_28725407的博客 448

Android中的缓存策略:LruCache和DiskLruCache

本篇文章主要是介绍Android中内置的两个缓存类的原理。所谓缓存,就是将获取的数据保存下来以便下次继续使用,这种技术尤其在网络请求和图片加载中有用,可以显著地提升App的性能表现。Android中也内置了两个缓存类,分别是和。

Tai_Monster的博客 1496

智能排班考勤系统原型

可实现从业务预测,到工时预估,再到人员分配全流程自动智能排班。可应用于客服行业或工厂的智能排班系统。

gywm15111336483的专栏 995

Android使用磁盘缓存DiskLruCache

DiskLruCache 不同于LruCache,LruCache是将数据缓存到内存中去,而DiskLruCache是外部缓存,例如可以将网络下载的图片永久的缓存到手机外部存储中去,并可以将缓存数据取出来使用,DiskLruCache不是google官方所写,但是得到了官方推荐,DiskLruCache没有编写到SDK中去,如需使用可直接copy这个类到项目中去。DiskLruCache地址: h

小马快跑的博客 1325

tkinter使用label视频播放

tkinter是python的界面开发包 使用tkinter显示视频流的一个办法是使用label来逐帧显示图片。 from Tkinter import * from PIL import ImageTk, Image import cv2 root = Tk() # Create a frame app = Frame(root, bg="white") app.grid() # Create a label in the frame lmian = Label(app) lmain.grid(

六十英里的专栏 5526

皮肤病识别 - 使用DenseNet或EfficientNet模型在ISIC数据集上进行皮肤病识别任务

在本篇博客中,我们探讨了如何使用 DenseNet 和 EfficientNet 模型在 ISIC 数据集上进行皮肤病识别任务。我们加载了数据集,并进行了预处理。然后我们使用 Keras 构建了两个不同的模型,并训练和评估了它们。最后,我们使用训练好的模型对新的皮肤病图像进行了预测。

斌擎科技 1307

Android LruCache和DiskLruCache简单使用

老生常谈 LruCache与DiskLruCache (附带Demo) 一、简介(粘贴一波)用的是kotlin,大家将就着看,都一样的。 1、LruCache简介 Lru算法Lru算法:最近最少使用算法;算法的核心关键类是LinkedHashMap。基本算法:将key-value键值对按照访问顺序进行排列放置,当存入的数据超过最大内存分配时,移除最久访问的数据 LruCache ...

yy1713的博客 1341

华为OD新系统机试真题 - 配置操作失败数量统计

华为OD机试新系统 4月8号【配置操作失败数量统计】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题【配置操作失败数量统计】。

qq_45776114的博客 1161

LruCache 和 DiskLruCache 的使用以及原理分析

常用的三级缓存主要有LruCache、DiskLruCache、网络,其中LruCache对应内存缓存、DiskLruCache对应持久化缓存。Lru表示最近最少使用,意思是当缓存到达限制时候,优先淘汰近期内最少使用的缓存,LruCache和DisLruCache都是如此。

三木仔 8375

【WRF运行报错】总结WRF运行时报错及解决方案(持续更新)

总结WRF运行时报错及解决方案(持续更新)

WW、forever的博客 1632

EtherCAT报文-BRD(广播读)抓包分析

EtherCAT报文之BRD(广播读)报文Wireshark抓包分析。

kevin1499的博客 1212

Android 缓存策略LruCache和DiskLruCache

1 BitmapFactory 对于加载Bitmap,系统提供了BitmapFactory类并提供四类方法:decodeFile()、decodeResource()、decodeStream()、decodeByteArray() 分别用于支持文件系统、资源、输入流以及字节数组中加载一个Bitmap对象,其中decodeFile()、decodeResource()内部间接调用了decodeSt...

Vincent的博客 228

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Android照片墙完整版,完美结合LruCache和DiskLruCache

在上一篇文章当中,我们学习了DiskLruCache的概念和基本用法,但仅仅是掌握理论知识显然是不够的,那么本篇文章我们就来继续进阶一下,看一看在实战当中应该怎样合理使用DiskLruCache。还不熟悉DiskLruCache用法的朋友可以先去参考我的上一篇文章 Android DiskLruCache完全解析,硬盘缓存的最佳方案 。 其实,在真正的项目实战当中如果仅仅是使用硬盘缓存的话,程序是有明显短板的。而如果只使用内存缓存的话,程序当然也会有很大的缺陷。因此,一个优秀的程序必然会将内存缓存和硬盘缓存

郭霖的专栏 9万+

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

【Android】Android内存缓存LruCache与DiskLruCache的使用及实现原理

在Android中,通常会通过缓存策略来优化性能,同时也会减少不必要的流量消耗。比如,用户第一次使用网络加载一张图片后,下次加载这张图片的时候,并不会从网络加载,而是会从内存或者磁盘加载这张图片。

2302_79323248的博客 867

android缓存图片LruCache和DiskLruCache

使用内存缓存LruCache 内存缓存可以提供对位图的快速访问,但代价是会占用宝贵的应用内存。LruCache类(支持库中也提供了该类,最低可支持 API 级别 4)非常适合用于以下任务:缓存位图,将最近引用的对象保持在强引用的LinkedHashMap中,并且在缓存超出其指定大小之前移除上次使用时间最早的成员。 注意:过去,最常用的内存缓存实现是SoftReference或Wea...

沁流年指尖的专栏 424

三级缓存原理【LruCache与DiskLrucache】

一、Android中的缓存策略 一般来说,缓存策略主要包含缓存的添加、获取和删除这三类操作。如何添加和获取缓存这个比较好理解,那么为什么还要删除缓存呢?这是因为不管是内存缓存还是硬盘缓存,它们的缓存大小都是有限的。当缓存满了之后,再想其添加缓存,这个时候就需要删除一些旧的缓存并添加新的缓存。 LRU(Least Recently Used)缓存算法: 因此LRU(Least Recent...

Lj_18210158431的博客 1106

LruCache和DiskLruCache的使用

LruCache是内存缓存,DiskLruCache对应的磁盘缓存。在学习Bitmap缓存优化的时候学习了这两种缓存方式,我觉得这种策略可以应用于Android的开发中(现在应该都是这样应用的吧),它不仅仅是Bitmap,它可以是商品,也可以是一组数据。现在就以Bitmap为案例,把我知道的关于Bitmap缓存的知识都记录下来。 LruCache在androidx.collection包下有这样一个类。先说说它的基本使用,首先创建LruCache的实例并分配给它内存的大小,然受重写siz...

Irving666的博客 552

Android三级缓存原理及用LruCache、DiskLruCache实现一个三级缓存的ImageLoader

Android图片三级缓存原理及用LruCache、DiskLruCache动手打造一个三级缓存的ImageLoader三级缓存概述三级缓存的流程强引用 、弱引用 、软引用、虚引用的区别:内存缓存LruCacheDiskLruCache: 三级缓存概述 缓存是一种通用的思想可以用在很多场景中,但在实际的开发中经常用于Bitmap的缓存,用于提高图片的加载效率、提升产品的用户体验和节省用户流量。目...

马彦虎的博客 5007

LruCache和DiskLruCache代码案例

```java import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.os.Environment; import android.util.L...

芮敏的博客 227
上一篇: Android主题
下一篇: Kotlin高阶函数
Ice_Lemon_dc
博客等级 码龄11年 82粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值