当前位置:

首页 > 系统应用 > 12.3 DrySister看妹子应用(第一版)——3.图片加载优化(写个图片缓存小框架)

12.3 DrySister看妹子应用(第一版)——3.图片加载优化(写个图片缓存小框架)

1.一些BB 上一节,妹子图片的数据来源已经从本地切到了Gank提供的接口解析结果。这一节就继续往前走,把这个图片加载类再打磨一下。优化点其实很明确:一方面,把显示本地图片的能力补上;另一方面,也是更关键的一点,就是缓存。现在这套图片加载逻辑几乎没有缓存可言,每次都得重新发起请求、再去解析流。哪怕是

本文目录

    1.一些BB

    上一节,妹子图片的数据来源已经从本地切到了Gank提供的接口解析结果。这一节就继续往前走,把这个图片加载类再打磨一下。优化点其实很明确:一方面,把显示本地图片的能力补上;另一方面,也是更关键的一点,就是缓存。现在这套图片加载逻辑几乎没有缓存可言,每次都得重新发起请求、再去解析流。哪怕是同一张图片,也得老老实实再请求一遍,多少有些重复劳动了。那如果把图片先缓存到内存里,或者干脆落到磁盘中,等下次访问同一张图片资源时直接从缓存里取,会不会更合适?答案其实很明显,这事儿确实值得做。所以这一节,就来动手写一个简单的、带缓存能力的图片加载框架,名字也定了,就叫SisterLoader。

    (PS:拖着好久没更的原因是因为自己最近在看下载相关的东西,还有改BUG 写图片加载的时候因为一些问题卡住了,抽不出时间解决...)

    2.简单常识科普

    开始写代码之前我们先来撸清楚一些概念先:

    1)缓存

    ①引入图片缓存的目的:

    答:从网络加载图片费时费电费流量,我们希望把一些加载过的图片可以存起来, 当再次加载时可以复用这个图片。

    ②什么是二级缓存:

    答:说下需要显示一张图片所经历的逻辑,你就一清二楚了: 需要显示图片 ——> 查内存(有的话显示) —没有—>查磁盘(有的话显示) —没有—> 从网络加载(显示出来) ——> 往内存中存一份 ——> 往磁盘存一份

    从上我们知道,缓存有两种,内存缓存和磁盘缓存(SD卡/机身存储):

    内存缓存:一级缓存,优先从这里拿,缓存文件存储在data/data/包名/cache目录下, 以前写内存缓存的老旧套路是用Map弱引用的Bitmap对象,我翻了翻上上上家公司的祖传代码:

    public class MemoryCache {
    private static final int MAX_CACHE_COUNT = 30;  //设置最大缓存数
    /**
        Map弱引用Bitmap,内存够的情况Bitmap不会被回收,当缓存数大于阈值,会清除最早放入缓存的
         */
        private HashMap> mCacheMap = new LinkedHashMap>() {
            @Override
            protected boolean removeEldestEntry(Entry eldest) {
                return size() > MAX_CACHE_COUNT;
            }
        };
    /**
         * 添加图片到缓存中
         * */
        public void put(String id,Bitmap bitmap) {
            mCacheMap.put(id, new SoftReference<>(bitmap));
        }
    /**
         * 取出缓存中的图片
         * */
        public Bitmap get(String id,Bitmap bitmap) {
           if(!mCacheMap.containsKey(id))return null;
            SoftReference ref = mCacheMap.get(id);
            return ref.get();
        }
    /**
         * 清除所有缓存
         * */
        public void clear() {
            try{
                for (Map.Entry>entry : mCacheMap.entrySet()) {
                    SoftReference sr = entry.getValue();
                    if(null != sr) {
                        Bitmap bitmap = sr.get();
                        if(null != bitmap) {
                            bitmap.recycle();
                        }
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    而Google老东家并不建议这样做,官方最佳实践中给我们推荐了关于缓存的两个API: LruCache(内存缓存) 和 DiskLruCache(磁盘缓存) LruCache是以强引用(直接引用)的方式引用外界的缓存对象的,不会被GC回收, 而SoftReference引用,当系统内存不足的时候回随GC回收 还有个WeakRefreence,随时都可能会被系统回收... 如果你对这个很有兴趣,可移步到官方的最佳实践:Caching Bitmaps

    磁盘缓存:

    应用可用的内存终归是有限的,遇到大批量图片时,不可能一股脑全塞进内存里。更稳妥的做法,是把图片落到磁盘中做缓存。早些年的常见方案,是直接在SD卡上建一个文件夹,再把图片存进去,这类实现网上很容易找到代码,这里就不展开了。本节重点放在前面提到的、Google 推荐的 DiskLruCache,用它来完成磁盘缓存。

    2)同步加载与异步加载

    同步和异步的概念,相信很多人都了然于心了,简单点说: 同步:发出加载图片的调用后,要直到完成加载才能够做其他操作 异步:发出加载图片的调用后,想干嘛就干嘛,不用等他加载完才能去做其他事。

    3)图片加载流程图

    4)图片OOM,压缩之类关于Bitmap的概念

    以前在入门教程那里写过就不再重复了:

    Android基础入门教程——8.2.1 Bitmap(位图)详解

    Android基础入门教程——8.2.2 Bitmap引起的OOM问题

    也可以移步到我的好基友——基神的个人博客查看,解释得更加详细:

    Android Bitmap 优化(1) - 图片压缩

    Android Bitmap 优化(2) - 图片缓存

    3.简单的图片加载框架流程图

    尽管代码不算复杂,觉得还是有必要画个流程图帮助大家理解一下~

    4.手撕代码时间

    PS:思前想后,还是把贴代码还是放最后吧,只做下代码折叠截图简单 解释一波,具体自己看代码,

    ①DiskLruCache.ja va

    这个是Google提供的,直接下这个类

    https://android.googlesource.com/platform/libcore/+/jb-mr2-release/luni/src/main/ja va/libcore/io/DiskLruCache.ja va

    然后加到你的工程里,自己改下包名就能用了~

    ②图片压缩类:SisterCompress.ja va

    ③网络加载协助类:NetworkHelper.ja va

    ④内存缓存协助类:MemoryCacheHelper.ja va

    ⑤磁盘缓存协助类:DiskCacheHelper.ja va

    ⑥尺寸转换类:SizeUtils.ja va

    PS: 设置ImageView大小用到

    ⑦加载结果类:LoaderResult.ja va

    PS:就是异步加载图片后传给Handler的数据集合

    ⑧图片加载逻辑控制类:SisterLoader.ja va

    ⑨调用图片加载框架:MainActivity.ja va

    private SisterLoader mLoader;
    mLoader = SisterLoader.getInstance(MainActivity.this);
    mLoader.bindBitmap(data.get(curPos).getUrl(),showImg,400,400);

    5.运行效果图

    先有网络加载一次,让应用做好内存和硬盘缓存 然后断开网络,点下一个妹子会加载内存缓存中的图片

    6.代码下载

    本节代码是切换到新的分支下编写的:sisterloader 代码编写完后,本地直接merge到develop分支,最后推送到Github的! 命令和上节的一样!

    https://github.com/coder-pig/DrySister/tree/develop

    欢迎follow,star,觉得有什么想加进来的可以提下issues!

    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
    作者最新文章
    系统应用 Edge
    相关文章 更多
    漫蛙漫画最新网址链接进入
    漫蛙漫画最新网址链接进入

    漫蛙漫画官网全解析:资源、体验与稳定性深度评测 “漫蛙漫画最新网址是什么?”“官方的在线观看入口在哪里?”——最近,这类问题在漫画爱好者圈子里可谓不绝于耳。别急,2025年最新、最稳的官方访问途径,这就为你一一道来。 官网入口直通车:https://www.manwamh.top 平台资源覆盖广度

    如何在Windows中创建网页快捷方式到桌面 Chrome/Edge网页保存方法
    如何在Windows中创建网页快捷方式到桌面 Chrome/Edge网页保存方法

    想在Windows桌面上快速访问常用网站,每次都要先打开浏览器再输入网址,确实有点麻烦。其实,给网页创建个桌面快捷方式,就能实现一键直达,方便不少。下面这几种方法,从最直观的拖拽到最灵活的批量处理,总有一款适合你。 一、通过Chrome或Edge地址栏右侧图标拖拽创建 这个方法最简单直接,利用的就是

    摩托罗拉edge 70怎么开启极简模式 摩托罗拉edge 70老人模式设置教程
    摩托罗拉edge 70怎么开启极简模式 摩托罗拉edge 70老人模式设置教程

    摩托罗拉Edge70可通过简易模式开启大图标大字体界面。进一步在辅助功能中调大字体、开启高对比度文字与深色主题以增强可读性。关闭动画效果与无关通知能减少干扰,锁定桌面布局并添加快捷启动栏可固化常用入口。若操作不便,可启用语音控制,通过指令直接完成打电话等核心功能。

    摩托罗拉edge 70怎么修改热点名称 摩托罗拉edge 70个人热点设置教程
    摩托罗拉edge 70怎么修改热点名称 摩托罗拉edge 70个人热点设置教程

    摩托罗拉Edge70可通过三种方式修改个人热点名称:在设置中进入连接与个人热点选项;通过下拉通知栏长按热点图标快速进入设置;或在高级设置中找到网络共享功能进行修改。修改时需输入不超过32个字符的新名称,建议使用英文、数字及短横线组合以确保兼容性,最后保存即可生效。

    edge怎么设置默认页面
    edge怎么设置默认页面

    microsoft edge可设置启动页、主页及精简新标签页:一、在“启动时”添加指定网址;二、开启主页按钮并设地址;三、关闭新闻源、快捷方式与背景;四、企业用户可用组策略或注册表强制锁定。 想让你的 Microsoft Edge 浏览器一启动就直达你想要的页面,而不是面对空白、繁琐的新闻流或者上次

    摩托罗拉edges锁屏签名设置方法
    摩托罗拉edges锁屏签名设置方法

    摩托罗拉edge s锁屏签名设置指南 说起摩托罗拉edge s,在国内市场首发时可谓风头十足。这款重磅回归的旗舰机型,凭借扎实的性能和配置,一度引发了抢购热潮,甚至出现一机难求的景象。对于已经入手的朋友来说,为自己的爱机添置些个性化元素,是再自然不过的想法。比如,为锁屏界面设置一个专属签名,就是彰显

    Edge官方搜索网页版入口
    Edge官方搜索网页版入口

    Edge官方搜索网页版入口与核心功能解析 关于Edge浏览器的官方入口,很多朋友都在询问。其实,答案非常明确:它的官网在线地址就是 https://www.microsoft.com/edge。这个入口是你获取正版、安全且功能完整Edge浏览器的唯一官方渠道。 多端同步体验 跨设备工作,最怕数据不同

    Edge浏览器怎么开启垂直标签页
    Edge浏览器怎么开启垂直标签页

    Edge浏览器怎么开启垂直标签页_Edge标签栏位置调整【分享】 觉得顶部标签栏太拥挤,想为网页留出更多纵向浏览空间?将Edge浏览器的标签页从顶部移到左侧,不仅能让多任务切换一目了然,还能有效释放顶部空间。想实现这一点,其实微软提供了不止一种方法,从一键切换到永久设置,总有一款适合你的操作习惯。接

    Edge浏览器收藏夹怎么排序
    Edge浏览器收藏夹怎么排序

    是的,Edge浏览器的收藏夹排序并不只有一种解法,灵活组合以下五种方式,可以应对从日常整理到批量管理的几乎所有场景:一、在收藏夹栏右键选择“按名称排序”;二、在管理页面使用“排序方式”下拉菜单;三、直接用鼠标拖拽调整顺序;四、利用集锦的卡片式布局进行动态重排;五、导出为HTML文件后,用外部工具进行

    PS网页版直接使用
    PS网页版直接使用

    PS网页版免费官方入口为https://www.adobe.com/products/photoshop/web.html,支持PSD编辑、实时协作、多色彩空间、智能抠图、AI修复、跨端同步、中文引导及SVG/PSD兼容等核心功能。 对于很多设计新手,或者只是偶尔需要处理图片的朋友来说,直接在线、免

    查看更多
    精品专题 更多
    装机必备
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows
    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    PDF教程
    PDF教程

    正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

    Mac软件 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    Aperty macOS版
    Aperty macOS版
    macOS

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    WINDOWS 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    PixTV 网页版
    PixTV 网页版
    Windows

    PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。