Android开发图片加载的二级缓存实现

Flutter相册功能开发:从权限管理到性能优化 在移动应用开发中,媒体文件访问是常见需求,Flutter通过photo_manager等插件提供了跨平台的解决方案。相册功能的核心在于高效访问设备存储,涉及权限管理、文件系统操作和多媒体处理等技术。通过分层架构设计,开发者可以实现相册目录浏览、多媒体展示和选择交互等基础功能,并进一步扩展智能分类、主题定制等高级特性。在社交类应用中,优化后的相册模块能显著提升用户体验,支持分页加载、缩略图处理和缓存策略等关键技术,确保在大量媒体文件场景下的流畅运行。本文以Flutter实现为例,详细解析了相册功能开发中的权限 阅读详情

二级缓存

网络加载完数据以后再将数据存储在本地缓存的目录下。
应用在调用的时候,先判断是否有本地缓存,然后再考虑是否进行网络访问。


二级缓存实现方法

Created with Raphaël 2.1.0网络下载网络下载本地缓存本地缓存加载图片类加载图片类图片下载完毕后,放入本地缓存本地缓存提供给加载图片类数据没有本地缓存就直接请求网络

由于需要访问文件夹,所以需要在ManiFest处开通相关的权限,如果是6.0的机器,需要动态访问相关的权限。


加载图片类

public class MyBitMapUtils {

    private NetCaCheUtils mNetCaCheUtils;
    private LocalCaCheUtils mLocalCacheUtils;

    public MyBitMapUtils(String tag) {
        mLocalCacheUtils = new LocalCaCheUtils();
        mNetCaCheUtils = new NetCaCheUtils(tag, mLocalCacheUtils);

    }

    public void display(ImageView mImage, String url) {
        //本地加载图片
        try {
            Bitmap bitmap = mLocalCacheUtils.getLocaCache(url);
            if (bitmap != null) {
                mImage.setImageBitmap(bitmap);
                Log.d(TAG, "display: " + "有本地缓存了");
                return;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        //网络加载图片
        mNetCaCheUtils.getBitMapFromNet(mImage, url);
    }
}

本地缓存类

public class LocalCaCheUtils {
    private static final String LOCAL_CACHE_PATH = Environment.getExternalStorageDirectory().getAbsolutePath() + "/zhbj_cache";

    //写本地缓存
    public void setLocalCache(String url, Bitmap bitmap) {
        File dir = new File(LOCAL_CACHE_PATH);
        if (!dir.exists() || !dir.isDirectory()) {
            dir.mkdirs();//创建文件夹
        }

        try {
            String fileName = MD5Encoder.encode(url);
            File cacheFile = new File(dir, fileName);
            bitmap.compress(Bitmap.CompressFormat.JPEG, 100, new FileOutputStream(cacheFile));
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    //读本地缓存
    public Bitmap getLocaCache(String url) throws Exception {
        File cacheFile = new File(LOCAL_CACHE_PATH, MD5Encoder.encode(url));
        if (cacheFile.exists()) {
            Bitmap bitmap = BitmapFactory.decodeStream(new FileInputStream(cacheFile));
            return bitmap;
        } else {
            return null;
        }

    }
}

网络缓存类

public class NetCaCheUtils {

    private ImageView imageView;
    private String url;
    private String tag;
    private LocalCaCheUtils mLocalCaCheUtils;
    /**
     * 传递settag的标识
     *
     * @param tag
     * @param mLocalCacheUtils
     */
    public NetCaCheUtils(String tag, LocalCaCheUtils mLocalCacheUtils) {
        mLocalCaCheUtils=new LocalCaCheUtils();
        this.tag = tag;
    }

    /**
     * 提供设置图片的方法
     * 传递两个参数
     *
     * @param mImage recycleview的view
     * @param url    下载地址
     */
    public void getBitMapFromNet(ImageView mImage, String url) {
        imageView = mImage;
        new BitMapTask().execute(mImage, url);
    }

    /**
     * 异步加载的方法
     */
    class BitMapTask extends AsyncTask<Object, Integer, Bitmap> {

        /**
         * 调用前使用的方法
         * 主线程运行
         */
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
        }

        /**
         * 后台运行,在子线程运行
         *
         * @param params
         * @return
         */
        @Override
        protected Bitmap doInBackground(Object[] params) {
            imageView = (ImageView) params[0];
            url = (String) params[1];
            //下载图片
            Bitmap bitmap = null;
            try {
                bitmap = download(url);
            } catch (IOException e) {
                e.printStackTrace();
            }
            return bitmap;
        }

        /**
         * 主线程运行,用于更新主线程UI
         *
         * @param result
         */
        @Override
        protected void onPostExecute(Bitmap result) {
            if (result != null) {
                imageView.setImageBitmap(result);
                try {
                    mLocalCaCheUtils.setLocalCache(url,result);
                } catch (Exception e) {
                    e.printStackTrace();
                }
                Log.d(TAG, "onPostExecute: 网络加载缓存了");
            }
        }

        //更新下载进度
        @Override
        protected void onProgressUpdate(Integer[] values) {
            super.onProgressUpdate(values);
        }

    }

    /**
     * 从网络下载图片的方法
     * @param url
     * @return
     * @throws IOException
     */
    public Bitmap download(String url) throws IOException {
        HttpURLConnection conn = (HttpURLConnection) new URL(url).openConnection();
        conn.setRequestMethod("GET");
        conn.setReadTimeout(5000);
        conn.setConnectTimeout(5000);
        int responseCode = conn.getResponseCode();
        if (responseCode == 200) {
            InputStream inputStream = conn.getInputStream();

            //根据输入流生成一个bitmap
            Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
            return bitmap;
        }
        if (conn != null) {
            conn.disconnect();
        }
        return null;
    }
}
Android ListView图片加载优化:二级缓存技术实现 双缓存机制的优化流程大致可以概括如下:当请求加载数据时,首先查询内存缓存。如果内存缓存中存在所需的数据,则直接使用,无需从磁盘读取。如果内存缓存中不存在,则查询磁盘缓存。如果磁盘缓存中存在所需数据,则将数据从磁盘加载到内存中,以便快速访问。如果磁盘缓存也不存在该数据,则需要从网络或其他数据源进行加载,并同时将新数据存储到磁盘和内存中以备后用。这种优化流程通过减少不必要的磁盘I/O操作,加快了数据访问速度,同时提高了应用的响应性。 阅读详情

相关推荐

android图片二级缓存的实现机制

github上的开源项目源码,提供实现代码的二级缓存

Android:二级图像缓存

在移动世界中,具有包含信息和一幅或两幅图像的可滚动项目列表是非常普遍的。 为了使这些列表具有良好的性能,大多数应用程序都遵循延迟加载的方法,该方法只是捕获并显示这些类型的列表中的图像。 这种方法非常适合将图像最初放入系统中。 但是,这种方法仍然存在一些问题。 每当图像需要在列表中向用户显示时,应用程序必须重新下载每个图像。 这给用户带来了非常糟糕的体验。 用户首次看到该列表时,他/她必...

181

android 图片的二级缓存

android 图片的二级缓存,让你不再担心你加载图片时的OOM问题

android二级缓存,Android中使用二级缓存、异步加载批量加载图片完整案例

一、问题描述Android应用中经常涉及从网络中加载大量图片,为提升加载速度和效率,减少网络流量都会采用二级缓存和异步加载机制,所谓二级缓存就是通过先从内存中获取、再从文件中获取,最后才会访问网络。内存缓存(一级)本质上是Map集合以key-value对的方式存储图片的url和Bitmap信息,由于内存缓存会造成堆内存泄露, 管理相对复杂一些,可采用第三方组件,对于有经验的可自己编写组件,而文件缓...

weixin_33514864的博客 310

Android二级缓存加载图片实现照片墙功能

实现二级缓存加载图片的功能,在使用DiskLruCache时,需先在工程中添加名为libcore.io的包,并将DiskLruCache.Java文件放进去。DiskLruCache直接百度下载即可。 在GridView的适配器中,为ImageView添加图片时,先从内存缓存中加载,内存中无缓存的话则在磁盘缓存中加载,磁盘缓存也没有的话开启线程下载,然后将下载的图片缓存到磁盘,内存中。下载的图片最好先进行压缩,文章最后给出了压缩代码,但本例中并未实现压缩。 /*二级缓存实现图片墙功能,先在内存中加载缓存,内存中无缓存的话到磁盘缓存中加载,仍然没有的话开启线程下载图片,下载后缓存到磁盘中,然后缓

Android中使用二级缓存、异步加载批量加载图片完整案例

一、问题描述 Android应用中经常涉及从网络中加载大量图片,为提升加载速度和效率,减少网络流量都会采用二级缓存和异步加载机制,所谓二级缓存就是通过先从内存中获取、再从文件中获取,最后才会访问网络。内存缓存(一级)本质上是Map集合以key-value对的方式存储图片的url和Bitmap信息,由于内存缓存会造成堆内存泄露, 管理相对复杂一些,可采用第三方组件,对于有经验的可自己编写组件,而文件缓存比较简单通常自己封装一下即可。下面就通过案例看如何实现网络图片加载的优化。 二、案例介绍 案例新闻的列表图片 三、主要核心组件 下面先看看实现一级缓存(内存)、二级缓存(磁盘文件)所编写的组件

Glide源码学习笔记四:内存二级缓存

Glide源码学习笔记四:内存二级缓存

liuyuzhou_的博客 444

Python + DeepSeek 完美结合:本地部署提效指南

随着生成式 AI 和深度学习技术的快速发展,如何将智能搜索工具与本地部署结合以提升效率成为了许多企业和开发者关注的重点。DeepSeek 是一款开源的智能搜索框架,结合 Python 的灵活性,能够实现高效、可靠的本地部署方案。本文将介绍如何通过 Python 和 DeepSeek 的完美结合,实现本地化部署并提升工作效率。通过将 Python 与 DeepSeek 结合,可以快速实现语义搜索的本地化部署,确保数据安全的同时提升工作效率。文件可直接作为 DeepSeek 的输入数据。

weixin_44872675的博客 1万+

Android 的二级缓存如斯简单,妈妈再也不用担心我找工作了

oid)**[外链图片转存中…(img-nujDgV10-1710916316682)]

m0_60635321的博客 665

轨迹规划——带抛物线过渡的直线插补

带抛物线过渡的直线插补

doudou2weiwei的博客 1985

STM32CubeMx搭建LWIP程序

  使用STM32CubeMx5.21,在stm32f745平台上搭建ethernet通信程序,PHY选用KSZ8081RNB。(LAN8742/DP83848使用一样) 1、系统时钟设置   RCC设置,勾选外部高速时钟源。   系统时钟配置。写入外部晶振频率、HSE提供PLCCLK、HCLK,其他参数自动生成。 2、ETH设置   勾选设置NVIC。   根据硬件设置对应GPIO引脚。   参数设置默认   根据硬件设置PHY地址,其他参数默认。 3、LWIP设置   勾选使能,通用参数设置

Gandalf94的博客 3239

Android通过两级缓存加载图片

Android两级缓存(LruCache和DiskLruCache)加载图片

从技术到艺术 384

机械设计师必看:如何用Autodesk Inventor高效完成钣金设计(附实战案例)

本文为机械设计师详细解析了如何利用Autodesk Inventor Professional高效完成钣金设计。文章通过一个钣金防护罩的实战案例,系统介绍了从核心设计逻辑、建模流程、参数化技巧到工程图输出的完整工作流,旨在帮助设计师掌握智能化的设计方法,显著提升从概念到制造的设计效率与准确性。

honey的博客 1182

Android图片加载框架Picasso最全使用教程 一

Picasso介绍Picasso是Square公司开源的一个Android图形缓存库 A powerful image downloading and caching library for Android 一个Android下强大的图片下载缓存库 Picasso实现了图片的异步加载,并解决了Android中加载图片时常见的一些问题

SmallCheric 8927

合宙Air780EP速连OneNET:AT+MQTT应用指南

本文详细讲解了合宙Air780EP使用AT指令通过MQTT接入OneNET的过程。

2401_82812461的博客 1390

CAN收发器TJA1145A休眠唤醒应用

TJA1145的唤醒工作原理主要依赖于其内部的唤醒机制和外部硬件的配合,主要涉及低功耗状态、选择性唤醒功能。TJA1145是一款CAN收发器,它支持多种工作模式,包括NormalStandbySleep等。在这些模式中,Sleep模式是最低功耗状态,而Normal模式则是最活跃的状态,其中Standby模式处于两者之间,允许一定的功能操作但功耗较低。TJA1145可以通过接收特定的唤醒源从Sleep或Standby模式唤醒到Standby或Normal模式。唤醒源的检测与处理。

radix关于mcu的博客,持续更新中... 5955

Android高效显示图片详解(三)

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34306676的博客 83

4、分布式发电系统中用于改善电能质量的有源、无源和混合滤波器

本文探讨了分布式发电系统中,尤其是光伏(PV)系统运行过程中引入的电能质量问题,并分析了有源滤波器、无源滤波器及混合滤波器在改善电能质量方面的应用。文章详细介绍了光伏系统的建模、最大功率点跟踪(MPPT)技术,以及谐波、电压波动等技术问题,同时对各类滤波器的拓扑结构和控制方法进行了系统性总结。通过仿真实例比较了不同滤波器在减少谐波方面的效果,为实际工程应用提供了参考依据。

transformer2023的博客 90

UniversalImageLoader源码解读01-用来显示图片的ImageAware

Android平台下有一个著名的图片加载框架叫UniversalImageLoader,这个框架经过几次重构才有今天,有良好的扩展性。如果你曾经在ListView中加载图片出现过图片错乱,如果你曾经因加载图片过多而遇到OOM,那么你应该考虑使用UniversalImageLoader了。     UniversalImageLoader支持二级缓存,内存+磁盘缓存,图片一旦从网络下载后会

mtaxot的博客 2039

【AI大模型:认知升级】1、全面解析AI大模型:从起源到发展脉络与应用价值

AI大模型是具备超大规模参数(千亿至万亿级)、海量训练数据(TB级)和强迁移学习能力的基础模型。其技术特征包括Transformer架构革新、大数据预训练范式及参数规模超过临界值后的能力涌现。发展历程经历了语言模型突破(2018-2020)、多模态融合(2021-2023)和架构创新(2023至今)三波浪潮,遵循数据、算力、算法协同进化规律。底层驱动因素包括能力涌现机制、算力基础设施突破和应用场景拓展,正在重构产业价值链。通过"知识星系""认知

2025博客之星Top81。专注AI工程化与架构实战。从分布式思维到模型部署,用工程化视角为你厘清AI落地的真实路径。 2293

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Android缓存机制

缓存 Android开发中,如果每次访问资源都通过网络访问会导致流量使用和速度慢的情况 对于图片或者另外大的资源的加载(视频,音频),使用缓存就很有必要 两种缓存方法 首先缓存到存储设备上,这样下次加载资源时就不需要使用网络,其次可以缓存到内存中,从内存中加载的速度要高于从存储设备中加载   所谓的二级缓存就是指即有内存缓存又有存储设备缓存   官方提供了LruCache和Disk...

yh18668197127的博客 371

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

android 一些链接

http://my.eoe.cn/1068282/archive/5547.html     音乐播放器demo 简单的功能实现。 http://my.eoe.cn/sisuer/archive/5296.html   史上最全Android开发资料:资源、UI、函数库、测试、构建全套教程 http://my.eoe.cn/sisuer/archive/5461.html   世界上最

huasen1990的专栏 614

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

巩固缓存相关,深入解析imageLoader

刚发布项目,正值谷歌大会。 顺带AS,并完善项目。 在缓存这方面深入,偶得一系列好文,转载收藏自 -------------->"阿敏其人" 安卓OOM和Bitmap图片二级缓存机制(一) http://www.jianshu.com/p/a7d9562405ef 安卓OOM和Bitmap图片二级缓存机制(二) http://www.jiansh

LeBang的博客 390

android 图片三级缓存实现

图片缓存的一般处理是 1.建立一个图片缓存池,用于存放图片对应的bitmap对象 2.在显示的时候,比如listview对应适配器的getView方法里进行加载图片的工作, 先从缓存池通过url的key值取,如果取到图片了直接显示, 如果获取不到再建立异步线程去下载图片(下载好后同时保存至图片缓存池并显示) 但是缓存池不能无限大啊~不然就会异常了,所以通常我们要对缓存池进行一定控制

盛夏一只虫的专栏 507

Android Bitmap 全面解析(二)加载多张图片的缓存处理 ...

 一般少量图片是很少出现OOM异常的,除非单张图片过~大~ 那么就可以用教程一里面的方法了 通常应用场景是listview列表加载多张图片,为了提高效率一般要缓存一部分图片,这样方便再次查看时能快速显示~不用重新下载图片 但是手机内存是很有限的~当缓存的图片越来越多,即使单张图片不是很大,不过数量太多时仍然会出现OOM的情况了~ 本篇则是讨论多张图片的处理问题 ---------

最帅的明天专栏 857

安卓OOM和Bitmap图片二级缓存机制(二)

在上一篇中,已经讨论了安卓中OOM发生的原因,情况和如何有效加载高清图片的。现在在此回顾一下: * 安卓OOM发生的原因:图片分辨率过大,导致加载图片所需的内存超过系统给进程(app)分配的运行内存,内存爆掉,产生OOM * 核心解决办法: 利用BitmapFactory。Options的inSimpleSize,计算出合适的图片采样率,减小图片分辨率。再续前缘,接下来的这篇博客里面我们说图片的

阿敏其人的专栏 2060
上一篇: 记录RecycleView的数据错乱BUG解决
下一篇: Android TextView的marquee跑马灯无效的坑
MonKing__
博客等级 码龄12年 3粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值