import java.lang.ref.SoftReference;
import java.util.LinkedHashMap;
import android.graphics.Bitmap;
import android.util.Log;
import android.util.LruCache;
/**
* @ClassName: MemoryCache
* @date 2014-6-11 下午05:30:25
* @Description: idea:1,two memory cache 2,file cache 3,network get
* @old modify:
* @new modify:
* @Version:
*/
public class MemoryCache {
// 1,two memory cache 2,file cache 3,network get
public static final String TAG = "memory";
// hard cache memory size
private final static int HARD_MEMORY_SIZE = 8 * 1024 * 1024;// 8m
// sofe cache num
private final static int SOFT_CACHE_CAPACITY = 6;
// hard cache
private final static LruCache<String, Object> mHardBitmapCache = new LruCache<String, Object>(
HARD_MEMORY_SIZE) {
@Override
public int sizeOf(String key, Object value) {
return ((Bitmap) value).getRowBytes() * ((Bitmap) value).getHeight();
// return 0;//not recycle memory
}
@Override
protected void entryRemoved(boolean evicted, String key,
Object oldValue, Object newValue) {
Log.v(TAG, "*********hard cache is full , push to soft cache*************");
// 硬引用缓存区满,将一个最不经常使用的oldvalue推入到软引用缓存区
mSoftBitmapCache.put(key, new SoftReference<Object>(oldValue));
}
};
@SuppressWarnings("serial")
private final static LinkedHashMap<String, SoftReference<Object>> mSoftBitmapCache = new LinkedHashMap<String, SoftReference<Object>>(
SOFT_CACHE_CAPACITY, 0.75f, true) {
@Override
public SoftReference<Object> put(String key, SoftReference<Object> value) {
Log.v(TAG, "*******SoftReference******get put bitmap******");
return super.put(key, value);
}
@Override
protected boolean removeEldestEntry(
Entry<String, SoftReference<Object>> eldest) {
if (size() > SOFT_CACHE_CAPACITY) {
Log.v(TAG, "Soft Reference limit , purge one");
return true;
}
return false;
}
};
// 缓存bitmap
public static boolean putBitmapInCache(String key, Object bitmap) {
if (bitmap != null) {
synchronized (mHardBitmapCache) {
Log.v(TAG, "putBitmapInCache...HardBitmapCache.size->" + mHardBitmapCache.size() + " key:" + key);
mHardBitmapCache.put(key, bitmap);
}
return true;
}
return false;
}
// 从缓存中获取bitmap
public static Bitmap getBitmapFromCache(String key) {
Bitmap bitmap = null;
synchronized (mHardBitmapCache) {
bitmap = (Bitmap) mHardBitmapCache.get(key);
if (bitmap != null) {
Log.v(TAG, "getBitmapFrom Hard Cache.............key:" + key);
return bitmap;
}
}
// 硬引用缓存区间中读取失败,从软引用缓存区间读取
synchronized (mSoftBitmapCache) {
SoftReference<Object> bitmapReference = mSoftBitmapCache.get(key);
if (bitmapReference != null) {
bitmap = (Bitmap) bitmapReference.get();
if (bitmap != null) {
Log.v(TAG, "getBitmapFrom Soft Cache..........key:" + key);
return bitmap;
} else {
Log.v(TAG, "soft reference is recycle...");
mSoftBitmapCache.remove(key);
}
}
}
return bitmap;
};
public static void freeMemory() {
Log.v(TAG, "freeMemory.............");
mHardBitmapCache.evictAll();
mSoftBitmapCache.clear();
// Clear the cache, calling entryRemoved(boolean, K, V, V) on each
// removed entry.
}
}
相关推荐
Oracle-如何修复undo坏快
undo出现坏快,导致数据库宕机,无法启动
MemoryCache
android 内存缓冲机制:
Go语言爬虫:chromedp 的详细使用
chromedp 是 Go 语言中无头浏览器自动化的终极利器。它能驱动真实的 Chrome 浏览器,处理 JavaScript 渲染、复杂交互和反爬虫机制
android 缓存书记,Android中内存缓存和文件缓存的实现原理
MemoryCache内存缓存类讲解内存缓存即把数据保存在内存中,如果缓存的数据超过设定的内存限制就删除最先缓存进来的数据。下面的MemoryCache缓存类是先创建一个Map对象(这里缓存的是Bitmap数据,所以Map的值为Bitmap),把缓存数据存入这个map对象中,想缓存数据时调用put(String id,Bitmap bitmap)方法,想从内存缓存中取数据时调用 get(Strin...
枪支/刀具检测 (gun, knife) - SIXray, Clasp Dataset,YOLOv11+UI界面+数据集
python复制编辑# 计算 CIoU 损失。
【功能安全】【AutoSAR】程序流监控机制
目录 一、程序流执行的常见故障 二、程序流的监控机制 1、监控功能的实现 2、三种监督机制 a、生命监测机制 b、截止时间监测机制 c、逻辑程序流监测机制 一、程序流执行的常见故障 与程序流相关的故障,在ISO26262中第六章附录D中定义如下: — 执行阻塞; — 死锁; — 活锁; — 执行时间的不正确分配; — 软件要素间的不正确同步。 二、程序流的监控机制 1、监控功能的实现 AutoSAR中对程序流的监控功能的实现主要有“看门狗”栈(Watchdog Stack).
Android 安卓DataBinding(六)·双向绑定(1)
UI这块知识是现今使用者最多的。当年火爆一时的Android入门培训,学会这小块知识就能随便找到不错的工作了。不过很显然现在远远不够了,拒绝无休止的CV,亲自去项目实战,读源码,研究原理吧!
【天气雷达】双偏振产品-差分传播相移KDP详解
双偏振产品-差分传播相移KDP详解。
android图片硬盘缓存,图片缓存策略
图片缓存策略1、图片缓存策略分析从网络上加载一张图,然后把它显示到UI上是个很简单的事情。当图片变多时,处理起来就有些麻烦了,很典型的应用场景,如ListView,GridView或者ViePager等。我们既需要保证用户看到更多的图片,以免屏幕出现大面积的空白,又要保证内存能Hold住。GC会自动释放一个没有强引用的图片或者View,这本来是个好事情,但为了让用户来回滚动时还能快速加载老图片,通...
从询价到回款:一篇讲透 SAP SD 销售与分销的实战入门指南
摘要: SAP SD(Sales and Distribution)模块是SAP ERP中管理销售与分销的核心组件,贯穿从订单到回款(Order-to-Cash)的全流程。其核心价值在于将销售业务结构化,通过主数据(客户、物料、定价)和交易单据(订单、交货、发票)实现流程可审计、可自动化。SD模块与物流(MM)、生产(PP)、财务(FI)深度集成,涵盖定价策略、信用控制、发运管理、国际贸易等复杂场景。关键设计包括条件技术(Condition Technique)实现灵活定价,单据流(Document Flo
【科研数据获取】根据Excel表个中的企业/公司信息批量获取经纬度坐标,并进行地图可视化
批量获取企业/公司的经纬度坐标,并进行地图可视化1 需求2 实现途径3 需求逐步实现 1 需求 在做项目的时候,老板或者项目答辩时候甲方最喜欢看到的就是可视化结果,尤其是涉及到地图可视化。很多时候会遇到企业/公司的数据,想要做地图可视化,必不可少的就是要获取它们具体地址:第一种就是像查户口一样精准一下具体的城镇街道,还有一种就是经纬度信息,前一种属于文字内容往往用于管理方面,第二种数字信息多用于数据处理与分析。 2 实现途径 获取地理信息数据,自然需要使用到地图的功能,这里直接采用百度地图的拾取坐标系统,
带你了解Android常见的内存缓存算法
带你了解Android常见的内存缓存算法本片博客主要简介以下两个问题 介绍一下常见的内存缓存算法 怎样实现这些算法 大家应该对ImageLoader这个框架都不陌生吧,一个很强大的图片加载框架,虽然作者去年的时候已经停止维护了,但里面的许多东西还是值得我们去学习的。本篇博客讲解的内存缓存算法正是基于ImageLoader的实现基础之上的常见的几种缓存算法 (1)LRU即Least RecentlyU
迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)
迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)
缓冲Bitmaps
最近在看Android Develop SDK,在讲Bitmap的缓冲时,我看到下面的这段话: Note: In the past, a popular memory cache implementation was a SoftReference or WeakReference bitmap cache, however this is not recommended. Starti
华为的C语言编程规范.pdf
华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。
SAP B1中文培訓教材_SDK
公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说
Android Bitmap内存管理与高效加载实战指南
在Android应用开发中,图片处理是核心环节,而Bitmap作为图片在内存中的表示形式,其内存管理与加载优化直接关系到应用性能与用户体验。理解Bitmap的内存模型是关键,其内存占用由像素数据主导,计算公式为宽×高×每像素字节数,不当使用极易引发OOM(内存溢出)。高效加载的核心在于按需采样与缓存复用,通过BitmapFactory.Options的inSampleSize进行尺寸压缩,并结合LruCache构建内存缓存策略,能显著降低内存压力并提升加载速度。这些技术广泛应用于社交、电商等需要大量图片展示
SIMATIC S7-1200, S7-1500 PID 控制[手册]
SIMATIC S7-1200, S7-1500 PID 控制[手册]
Android内存管理与性能优化面试真题
概念解析:LRU算法的⼯程实现 LruCache(Least Recently Used,最近最少使⽤)是Android提供的⼀个核⼼缓存⼯具类。它的设计理念⾮常符合⼈类直觉:“如果⼀个数据最近被访问过,那么它在未来被访问的概率12 / 38极⾼;反之,如果⼀个数据很久没被碰过,当内存吃紧时,它就应该第⼀个被踢出局。” 在源码层⾯,LruCache 的底层⼼脏是⼀个 LinkedHashMap。
Glide手写实现之内存缓存
内存缓存 Glide中的内存缓存是二级缓存,当活动缓存中取不到资源的时候,再从内存缓存中取。内存缓存用的LRU算法缓存。其原理是当缓存已满再加入元素时最不常使用的元素会被移除。 LRU算法 LRU算法的原理比较简单,数据存储的数据结构为链表。当访问数据时,如缓存中有数据,则将该数据移动至链表的顶端;没有该数据则在顶端加入该数据,并移除链表中的低端的数据。 LRUCache Android的v4兼容...
android图片资源加载失败,Android图片加载库Picasso源码分析
图片加载在Android开发中是非常重要,好的图片加载库也比比皆是。ImageLoader、Picasso、Glide、Fresco均是优秀的图片加载库。以上提到的几种图片加载库各有特色。用法与比较,网上已经很多了。出于学习的角度,个人认为从Picasso入手较好。代码量小,同时API优美,很适合我们学习。今天笔者就Picasso的源码进行分析,抛出一些图片加载的技术细节供园友参考。PS:建议园友...
基于Eclipse的Android应用开发实战:从MVC架构到完整项目构建
Android应用开发的核心在于理解其架构模式与工程化实践。经典的MVC(Model-View-Controller)架构清晰地分离了数据、界面与逻辑,为应用的可维护性奠定了基础。通过模块化设计与异步处理机制,开发者能够构建响应迅速、用户体验良好的应用。在工程实践中,数据持久化方案如SQLite数据库与SharedPreferences,以及多媒体处理如VideoView的视频播放,是实现核心功能的关键技术。这些技术共同支撑了在线教育、内容消费等复杂场景的应用开发。本文以“博学谷”这一综合性学习应用为例,详
Android高性能AI日志库StatLog:结构化日志与性能监控实践
在移动应用开发中,日志记录是调试与性能监控的基础技术,其核心原理是通过记录程序运行时的状态与事件,帮助开发者理解应用行为。传统日志工具在记录方式上多为非结构化文本,难以进行自动化分析,尤其在面对高性能要求和复杂AI场景时,其I/O开销和字符串处理往往成为性能瓶颈。为了解决这一问题,现代日志库转向了结构化、语义化的设计范式,通过内存缓冲、异步处理和批量化输出等技术,将日志记录的性能开销降至最低。这种技术革新为应用性能监控(APM)和AI模型推理的深度可观测性提供了可能,使得开发者能够在不影响应用流畅度的前提下
欢聚时代Android笔试题深度解析:核心考点与复习策略
在Android开发领域,无论是校招还是社招,面试官始终关注候选人对底层原理的理解深度。从Activity生命周期到Handler消息机制,再到自定义View的测量与绘制,这些看似基础的知识点,实则构成了Android客户端开发的核心地基。掌握这些原理,不仅有助于解决内存泄漏、界面卡顿等实际工程问题,还能在业务场景中做出更合理的技术选型。通过系统梳理历年大厂校招笔试题,可以发现考点与真实业务需求高度契合,例如直播应用中的任务栈管理、图片加载的缓存策略等。回归基础,理解概念背后的运行逻辑,是应对技术栈不断演进
Glide WebP动图压缩技术:如何实现60%体积缩减与流畅加载体验
在移动应用开发中,动图加载性能直接影响用户体验和流量消耗。传统GIF格式动图体积庞大、解码效率低,已成为Android应用性能优化的瓶颈。Glide作为Android平台领先的图片加载库,通过WebP动图压缩技术,为开发者提供了高效的解决方案。本文将深入解析Glide WebP动图压缩的核心原理、实施路径和量化收益。 ### 技术痛点与解决方案 **传统动图加载面临三大挑战**: 1. **文
Listview异步加载图片之优化篇
在 APP应用中,listview的异步加载图片方式能够带来很好的用户体验,同时也是考量程序性能的一个重要指标。关于listview的异步加载,网上 其实很多示例了,中心思想都差不多,不过很多版本或是有bug,或是有性能问题有待优化。有鉴于此,本人在网上找了个相对理想的版本并在此基础上进行改 造,下面就让在下阐述其原理以探索个中奥秘 贴张效果图先: 异步加载图片...
Midscene.js自动化脚本性能瓶颈深度解析:5个进阶优化方案解决卡顿问题
Midscene.js作为跨平台AI驱动的视觉自动化工具,在复杂任务场景下常面临性能瓶颈。本文将深入分析性能问题的根源,提供从架构到实践的完整优化方案,帮助开发者将自动化脚本执行效率提升3倍以上。 ## 🔍 第一部分:性能瓶颈深度诊断与根源分析 ### 1.1 图像处理:AI自动化中的最大性能消耗点 Midscene.js的核心性能瓶颈源于视觉AI模型的图像处理开销。每次自动化操作都需要进
[Android] Glide核心逻辑解析
Glide核心逻辑解析 分三个模块进行,分别是Registry(注册器), Engine(请求),Cache(缓存)。 Registry模块 Registry的职责是注册Glide的所有组件,是Glide扩展的基石,目前在Registry中注册的组件有ModelLoaderFactory,ResourceDecoder, DataRewinder, Encoder。 我们看下个组件职责: Mod...
C#实现西门子PLC数据采集系统开发指南
工业自动化中的数据采集是智能制造的核心技术之一,通过PLC(可编程逻辑控制器)与SCADA系统的配合实现设备状态监控。现代工业场景对数据采集系统提出了更高要求,需要支持多种通信协议(如S7、OPC UA、Modbus TCP等)并具备高可靠性。C#凭借其高效的开发效率和丰富的类库支持,成为构建定制化数据采集系统的理想选择。本文以西门子S7系列PLC为例,详细解析如何使用C#开发具备断点续传、动态标签管理等高级功能的数据采集系统,并分享工业现场实施中的性能优化与异常处理经验。
570



被折叠的 条评论
为什么被折叠?



