如何高效使用和管理Bitmap--图片缓存管理模块的设计与实现

【Android性能优化】Android图片加载方案--Bitmap的内存管理和优化方案 写在前面:笔者的上一篇博文有提到过,如果不恰当的使用Bitmap,很容易造成OOM。这篇博文就来谈谈应该如何正确的管理Bitmap的内存,以及优化策略。参考: Google官方教程 – 《Android Training Ccourse》一、加载按显示需要的比例缩小的图片1、先来说说屏幕密度 在Android中,Imageview控件的长宽单位一般设置为dp/dip,而不用px。这样做的原因,是因为 阅读详情

传送门 ☞ 轮子的专栏 ☞ 转载请注明 ☞ http://blog.youkuaiyun.com/leverage_1229

        上周为360全景项目引入了图片缓存模块。因为是在Android4.0平台以上运作,出于惯性,都会在设计之前查阅相关资料,尽量避免拿一些以前2.3平台积累的经验来进行类比处理。开发文档中有一个BitmapFun的示例,仔细拜读了一下,虽说围绕着Bitmap的方方面面讲得都很深入,但感觉很难引入到当前项目中去。

        现在的图片服务提供者基本上都来源于网络。对于应用平台而言,访问网络属于耗时操作。尤其是在移动终端设备上,它的显著表现为系统的延迟时间变长、用户交互性变差等。可以想象,一个携带着这些问题的应用在市场上是很难与同类产品竞争的。
        说明一下,本文借鉴了 Keegan小钢和安卓巴士的处理模板,主要针对的是4.0以上平台应用。2.3以前平台执行效果未知,请斟酌使用或直接略过:),当然更欢迎您把测试结果告知笔者。

1图片加载流程

        首先,我们谈谈加载图片的流程,项目中的该模块处理流程如下:

        在UI主线程中,从内存缓存中获取图片,找到后返回。找不到进入下一步;
        在工作线程中,从磁盘缓存中获取图片,找到即返回并更新内存缓存。找不到进入下一步;
        在工作线程中,从网络中获取图片,找到即返回并同时更新内存缓存和磁盘缓存。找不到显示默认以提示。

2内存缓存类(PanoMemCache)

        这里使用Android提供的LruCache类,该类保存一个强引用来限制内容数量,每当Item被访问的时候,此Item就会移动到队列的头部。当cache已满的时候加入新的item时,在队列尾部的item会被回收。

public class PanoMemoryCache {

    // LinkedHashMap初始容量
    private static final int INITIAL_CAPACITY = 16;
    // LinkedHashMap加载因子
    private static final float LOAD_FACTOR = 0.75f;
    // LinkedHashMap排序模式
    private static final boolean ACCESS_ORDER = true;

    // 软引用缓存
    private static LinkedHashMap<String, SoftReference<Bitmap>> mSoftCache;
    // 硬引用缓存
    private static LruCache<String, Bitmap> mLruCache;
    
    public PanoMemoryCache() {
	// 获取单个进程可用内存的最大值
	// 方式一:使用ActivityManager服务(计量单位为M)
        /*int memClass = ((ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE)).getMemoryClass();*/
	// 方式二:使用Runtime类(计量单位为Byte)
        final int memClass = (int) Runtime.getRuntime().maxMemory();
        // 设置为可用内存的1/4(按Byte计算)
        final int cacheSize = memClass / 4;
        mLruCache = new LruCache<String, Bitmap>(cacheSize) {
            @Override
            protected int sizeOf(String key, Bitmap value) {
                if(value != null) {
                    // 计算存储bitmap所占用的字节数
                    return value.getRowBytes() * value.getHeight();
                } else {
                    return 0;
                }
            }
            
            @Override
            protected void entryRemoved(boolean evicted, String key, Bitmap oldValue, Bitmap newValue) {
                if(oldValue != null) {
                    // 当硬引用缓存容量已满时,会使用LRU算法将最近没有被使用的图片转入软引用缓存
                    mSoftCache.put(key, new SoftReference<Bitmap>(oldValue));
                }
            }
        };
        
	/*
	* 第一个参数:初始容量(默认16)
	* 第二个参数:加载因子(默认0.75)
	* 第三个参数:排序模式(true:按访问次数排序;false:按插入顺序排序)
	*/
        mSoftCache = new LinkedHashMap<String, SoftReference<Bitmap>>(INITIAL_CAPAC
MATLAB打开.m文件乱码解决办法 Matlab打开.m文件出现中文乱码问题,是因为Matlab存在两种编码格式:GBK和UTF-8,而不同版本的Matlab编码格式可能不统一,因此在不同版本的Matlab打开文件,由于编码格式的改变,会导致注释乱码。 1.查看你的Matlab的文件编码方式,在Matlab的命令行窗口输入feature('locale') ,如下图,可以看到默认编码为GBK,那问题就变成了将Matlab的文件编码方式GBK修改成UTF-8; 2.找到你的Matlab安装目录bin文件夹下的lcdata_utf. 阅读详情

相关推荐

Keil5打开文件中文乱码?手把手调整ANSI编码

遇到keil5中文乱码的解决困扰?通过调整文件编码为ANSI,轻松修复显示异常。无论是注释还是变量名,都能正确显示中文,提升开发体验。

weixin_29935511的博客 1057

Embarcadero Dev-C++中文乱码解决方案:编码格式调整实战

本文针对Embarcadero Dev-C++控制台输出中文乱码问题,提供了详细的诊断与解决方案。核心在于解决源代码文件编码(如UTF-8)与Windows控制台默认编码(ANSI/GBK)不匹配的问题。文章推荐使用Notepad++等工具将源文件编码转换为ANSI/GBK,并逐步演示了操作流程,是解决Dev-C++中文乱码最直接有效的方法。

prometheus5watch的博客 1179

解决用VScode写中文注释,Vivado打开之后是乱码的方法

这样就解决了中文注释乱码的问题,此外如果使用notepad++写verilog代码的话直接在notepad++上面将编码格式改为ANSI格式即可,更加方便快捷,所以此方法仅针对习惯用VScode写Verilog的同学,如果有其他好办法的话欢迎评论区补充。首先,VScode中的中文默认编码格式是UTF-8,然后Vivado的编码格式是vivado 默认的应该是ANSI编码格式,刚开始我先按照网上说明的,将VScode中的编码格式改为GBK格式(点击右下角->点击通过编码保存)。

weixin_50573305的博客 5813

Keil乱码问题实战案例:UTF-8转ANSI操作指南

遇到Keil中文注释乱码问题不用慌,根本原因通常是文件编码不兼容。通过将UTF-8编码文件转换为ANSI格式,可彻底解决Keil乱码难题,确保中文注释正常显示,提升嵌入式开发体验。

weixin_33308579的博客 958

快速理解Keil乱码成因:ANSI与UTF-8转换说明

遇到Keil中文注释乱码问题?根源常在文件编码格式不匹配。通过理解ANSI与UTF-8之间的转换机制,可快速定位并修复乱码,确保代码注释清晰可读,提升开发效率。

weixin_35307279的博客 680

批处理文件中文乱码?5分钟教你用Notepad++和chcp命令彻底解决

本文深度解析Windows批处理脚本中文乱码的根源,并提供实战解决方案。通过Notepad++将文件编码转换为UTF-8无BOM格式,并在脚本首行使用chcp 65001命令切换控制台代码页,可彻底解决中文路径和文本显示问题。文章还包含完整脚本案例与疑难排查技巧,助您构建健壮的自动化脚本。

c6d7e8f9g的博客 646

Notepad++编码转换全攻略:从BOM头问题到批量处理技巧

本文详细解析了Notepad++处理文件编码问题的完整方案,重点解决UTF-8 BOM头导致的PHP报错、页面空白等常见问题。文章对比了ANSI、GBK、UTF-8等主流编码差异,提供了从单文件精准转换到批量处理的实战技巧,帮助开发者和办公人员彻底告别乱码困扰,提升跨平台协作效率。

weixin_29209825的博客 649

为什么你的中文TXT文件总是乱码?详解ANSI与UTF-8编码区别及永久修改默认编码技巧

本文深入解析了中文TXT文件乱码的根本原因,详细对比了ANSI(GBK)与UTF-8编码的核心区别,包括存储原理、兼容性与适用场景。文章提供了从识别、转换单个文件编码,到永久修改Windows系统默认编码及配置专业编辑器的系统性解决方案,旨在帮助用户彻底告别乱码困扰。

alpha的博客 424

告别Matlab中文乱码:从GBK到UTF-8,一篇文章讲清编码原理与Notepad++实战

本文深入解析Matlab中文乱码问题的根源,对比GBK与UTF-8编码标准的差异,并提供Notepad++实战教程,帮助开发者彻底解决编码转换难题。通过系统级配置和批量处理脚本,实现一劳永逸的编码统一方案,特别适合处理跨版本协作中的中文注释乱码问题。

weixin_28267011的博客 304

Win10自动更新怎么永久关闭?有效的Win10强制更新关闭方法

之前小编为大家分享过一些Win10彻底关闭Windows Update自动更新的方法,主要是通过一些如设置流量计费或借助一些专门的小工具来实现,但往往会发现,Win10自动更新就像打不死的小强,不管怎么关闭,之后还是会自动更新,让不少小伙伴颇为不爽。今天小编带来了这篇改进型教程,通过全方位设置,彻底关闭Win10自动更新,感兴趣的小伙伴不妨试试吧。 ...

jianai0602的博客 108万+

小红书私信接口与Hook技术实战:微信跳转卡片的合规与破解之道

本文深入探讨了小红书私信接口与Hook技术的实战应用,重点解析了微信跳转卡片的合规使用与破解方法。通过官方私信接口的合规玩法与Xposed框架的Hook技术对比,为开发者提供了技术选型指南和实战建议,帮助实现高效的用户跳转与转化。

weixin_30399821的博客 736

Altium Designer 21 DRC检查:从新手到高手,这10个常见错误你踩过几个?

本文详细解析Altium Designer 21 DRC检查中的10个高频错误,包括间距违规、线宽违规、未连接网络等常见问题,并提供精准修复方案和实战技巧。通过分层诊断、智能规则设置和三维排查等方法,帮助工程师从新手进阶为高手,提升PCB设计效率和质量。

weixin_26873711的博客 222

Coze工作流实战:Coze一键生成沉浸式历史故事视频

【coze工作流实战】一键生成火爆的沉浸式历史故事视频!短短3分钟,顶替你3天的工作量!

bickys的博客 1004

Modbus 通信协议详解

Modbus是由 Modicon(现为施耐德电气公司的一个品牌)在 1979 年发明的,是全球第一个真正用于工业现场的总线协议。ModBus网络是一个工业通信系统,由带智能终端的可编程序控制器和计算机通过公用线路或局部专用线路连接而成。其系统结构既包括硬件、亦包括软件。它可应用于各种数据采集和过程监控。为更好地普及和推动Modbus在基于以太网上的分布式应用,目前施耐德公司已将Modbus协议的所有权移交给 IDA(,分布式自动化接口)组织,并成立了 Modbus-IDA 组织。

Projectsauron 的博客 7万+

电磁场仿真软件:Sonnet_(1).Sonnet软件概述

根据特定需求自定义仿真流程,如多频率点仿真、多边界条件仿真等。

kkchenjj的博客 1450

【MATLAB】嵌入式PID控制参数整定与优化

本文提出了一种基于MATLAB仿真的嵌入式PID参数优化方法,解决了传统人工试凑法效率低、适应性差的问题。通过建立一阶滞后被控对象模型,对比分析了不同PID参数组合的性能表现,筛选出最优参数。仿真结果表明,优化后的PID参数能有效降低超调量(从传统方法的显著超调降至接近0%),缩短调节时间,提高稳态精度。最终将优化算法部署到STM32平台,实现了"仿真整定-参数优化-嵌入式落地"的完整开发流程。该方法显著提升了嵌入式系统的响应速度和控制精度,为工业控制应用提供了标准化解决方案。

unber的博客 46

Autosar进阶专栏索引

Autosar进阶专栏索引

赞的博客 3540

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

上一篇: Android定制组件之图文展示之中国好声音
下一篇: 360°全景影像移动端类库--PanoramaGL
innovation
博客等级 码龄14年 251粉丝 136原创
评论 18
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值