Android如何最优化的读取一张Bitmap

本文讨论了Drawable缓存问题及清晰度优化,通过分析资源加载与内存管理,提出了利用图片采样大小和资源预加载策略来提高用户体验与减少内存消耗的方法。重点介绍了如何在不同屏幕尺寸下动态调整图片大小,实现清晰度与内存占用之间的平衡。
Drawable缓存问题,显示清晰度,

Resource.getDrawable会根据ID返回Drawable,然后把这个Drawable缓存起来,看以下这个代码段:
[java]  view plain copy
  1. InputStream is = mAssets.openNonAsset(  
  2.                                 value.assetCookie, file, AssetManager.ACCESS_STREAMING);  
  3.         //                System.out.println("Opened file " + file + ": " + is);  
  4.                         dr = Drawable.createFromResourceStream(this, value, is,  
  5.                                 file, null);  
  6.                         is.close();  

[java]  view plain copy
  1. dr.setChangingConfigurations(value.changingConfigurations);  
  2.             cs = dr.getConstantState();  
  3.             if (cs != null) {  
  4.                 if (mPreloading) {  
  5.                     sPreloadedDrawables.put(key, cs);  
  6.                 } else {  
  7.                     synchronized (mTmpValue) {  
  8.                         //Log.i(TAG, "Saving cached drawable @ #" +  
  9.                         //        Integer.toHexString(key.intValue())  
  10.                         //        + " in " + this + ": " + cs);  
  11.                         mDrawableCache.put(key, new WeakReference<Drawable.ConstantState>(cs));  
  12.                     }  
  13.                 }  
  14.             }  

缓存机制设计的很好,使用了弱引用机制避免内存溢出。但这个方法比较老实,如果资源是一张Bitmap的话,原图是多大,它就会生成多大的。为了让程序在不同的屏幕上面都比较清晰,并且图片占用内存不会过大,通常会根据不同的屏幕选择加载不同的图,但这样包大小又上去了,一般,我们会用到这样一个解决办法:

只放一张最大清晰度的图,程序运行时根据当前屏幕尺寸对图片进行缩放。

这个办法有一个缺点,就是加载时会先加载一张大图,再根据大图去生成小图,内存峰值是两张图,在内存紧张的手机上有什么办法么?下面是解决方案:

[java]  view plain copy
  1. private BitmapDrawable getDrawable(int id) {  
  2.         int width = AppTools.getSreenSize(thistrue);  
  3.         int height = AppTools.getSreenSize(thisfalse);  
  4.         BitmapFactory.Options opts = new BitmapFactory.Options();  
  5.         opts.inJustDecodeBounds = true;  
  6.         BitmapFactory.decodeResource(getResources(), id, opts);  
  7.         opts.inSampleSize = AppTools.computeSampleSize(opts, -1,  
  8.                 (int) (width * height));  
  9.         opts.inJustDecodeBounds = false;  
  10.         Bitmap bitmap = null;  
  11.         try {  
  12.             bitmap = BitmapFactory.decodeResource(getResources(), id, opts);  
  13.         } catch (OutOfMemoryError e) {  
  14.         }  
  15.         if (bitmap == null) {  
  16.             return null;  
  17.         }  
  18.         return new BitmapDrawable(bitmap);  
  19.   
  20.     }  
先使用获取图片的宽高,然后根据目标宽高计算出采样大小,最后再真正读取图片。

[java]  view plain copy
  1. BitmapFactory.Options opts = new BitmapFactory.Options();  
  2.         opts.inJustDecodeBounds = true;  
  3.         BitmapFactory.decodeResource(getResources(), id, opts);  
内容概要:本文研究了一种基于短时傅里叶变换(STFT)结合卷积神经网络(CNN)与残差网络(ResNet)的故障诊断方法,并提供了Matlab代码实现。该方法首先利用STFT将一维时域振动信号转换为二维时频图,以直观呈现信号的频率随时间变化特征;随后构建CNN-ResNet深度学习模型,通过卷积层自动提取故障相关的深层特征,并利用ResNet的残差结构缓解深层网络训练中的梯度消失问题,提升模型收敛速度与诊断精度。整个流程实现了端到端的故障识别,适用于轴承、齿轮箱等机械设备的智能故障诊断。; 适合人群:具备一定信号处理基础和Matlab编程能力,从事机械故障诊断基于短时傅里叶变换(STFT)结合卷积神经网络(CNN)和残差网络(ResNet)的故障诊断研究(Matlab代码实现)、工业自动化或智能制造方向的研究生、科研人员及工程技术人员。; 使用场景及目标:①应用于旋转机械系统的状态监测与早期故障预警;②用于学术研究中对比不同深度学习模型在故障诊断中的性能差异;③作为智能运维系统的核心算法模块,提升设备维护效率与可靠性。; 阅读建议:建议读者结合文中提供的Matlab代码进行实践操作,深入理解STFT时频分析原理与CNN-ResNet网络架构设计,同时可尝试在公开数据集(如CWRU轴承数据集)上验证模型效果,并进一步探索其他时频分析方法与网络结构的融合优化。
【源码免费下载链接】:https://renmaiwang.cn/s/h82is Sentinel是Redis的一个关键组件,主要提供稳定性方案以保证集群的高可用性(HA)。在Redis集群中,Sentinel负责监控主节点和从节点的状态,当主节点出现故障时,它会自动启动故障转移机制。具体来说,在检测到主节点故障后,Sentinel会将一个从节点提升为主节点,并指导其他从节点重新配置为新的辅助角色。这种机制确保即使在主节点出现问题的情况下,服务仍能持续运行,从而显著提升了系统的可靠性。对于Redis集群的稳定运行而言,集群配置文件至关重要,因为它包含了Sentinel执行监控、故障判定和转移操作所依据的核心规则。 以下是对Redis Sentinel集群配置文件的关键知识点进行了详细说明: 1. **基础设置项**: - `port`:指定每个Sentinel实例监听的具体端口号。 - `bind`:定义Sentinel的监听IP地址,允许多个地址选择。 - `sentinel monitor`:配置主节点监控规则,格式为`sentinel monitor <master-name> <ip> <port> <quorum>`。其中,`master-name`为主节点别名,`ip`和`port`为主节点的IP及端口号,而`quorum`表示系统需要达到多少个Sentinel同意主节点出现故障才会启动转移。 2. **故障判定机制**: - `quorum`:决定系统在何种情况下触发故障转移。通常设置为总Sentinel数量的大头。 - `down-after-milliseconds`:设定主节点失联的时间阈值,超过此时间将视为节点失效。 3. **故障转移操作**: - `sentinel平行查询安全因子`:(`sentinel parallel-syncs`) 表示在执
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值