android 内存缓冲机制:MemoryCache

通过MemoryCache加载图片 blog地址:http://blog.youkuaiyun.com/hfut11/article/details/48296429 立即下载
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.
	}
}

欧姆龙 CJ1W-SCU模块使用通配符+结束码实现非固定长度数据的接收 实验设备:CJ2M-CPU33、CJ1W-SCU21、XW2Z-200T 实验目的:了解 CJ1W-SCU 通配符使用 1.硬件接线: CJ1W-SCU21单元号拨码置于8,使用串口1(232口)。 2.软件设置: ① 新建工程,选择PLC型号CJ2M-CPU33,切换到编程模式,如下图: 、 ② 创建I/O并进行相关配置,如下图: ③ 设置为用户设置,协议宏模式,8位数据位,2位停止位,偶校验9600波特率,如下图: 、 ④ 打开CX-Protocal软件,新建工程: . 阅读详情

相关推荐

Oracle-如何修复undo坏快

undo出现坏快,导致数据库宕机,无法启动

qqqyyy0422的博客 570

MemoryCache

android 内存缓冲机制:

非淡泊无以明志,非宁静无以致远 1万+

Go语言爬虫:chromedp 的详细使用

chromedp 是 Go 语言中无头浏览器自动化的终极利器。它能驱动真实的 Chrome 浏览器,处理 JavaScript 渲染、复杂交互和反爬虫机制

数据知道的博客 4493

android 缓存书记,Android中内存缓存和文件缓存的实现原理

MemoryCache内存缓存类讲解内存缓存即把数据保存在内存中,如果缓存的数据超过设定的内存限制就删除最先缓存进来的数据。下面的MemoryCache缓存类是先创建一个Map对象(这里缓存的是Bitmap数据,所以Map的值为Bitmap),把缓存数据存入这个map对象中,想缓存数据时调用put(String id,Bitmap bitmap)方法,想从内存缓存中取数据时调用 get(Strin...

weixin_42514949的博客 290

枪支/刀具检测 (gun, knife) - SIXray, Clasp Dataset,YOLOv11+UI界面+数据集

python复制编辑# 计算 CIoU 损失。

YOLO 539

【功能安全】【AutoSAR】程序流监控机制

目录 一、程序流执行的常见故障 二、程序流的监控机制 1、监控功能的实现 2、三种监督机制 a、生命监测机制 b、截止时间监测机制 c、逻辑程序流监测机制 一、程序流执行的常见故障 与程序流相关的故障,在ISO26262中第六章附录D中定义如下: — 执行阻塞; — 死锁; — 活锁; — 执行时间的不正确分配; — 软件要素间的不正确同步。 二、程序流的监控机制 1、监控功能的实现 AutoSAR中对程序流的监控功能的实现主要有“看门狗”栈(Watchdog Stack).

专注汽车软件开发、AutoSAR、车载以太网、SOA、EE架构。 4519

Android 安卓DataBinding(六)·双向绑定(1)

UI这块知识是现今使用者最多的。当年火爆一时的Android入门培训,学会这小块知识就能随便找到不错的工作了。不过很显然现在远远不够了,拒绝无休止的CV,亲自去项目实战,读源码,研究原理吧!

w5jaLw的博客 1132

【天气雷达】双偏振产品-差分传播相移KDP详解

双偏振产品-差分传播相移KDP详解。

珞瑜的博客 2662

android图片硬盘缓存,图片缓存策略

图片缓存策略1、图片缓存策略分析从网络上加载一张图,然后把它显示到UI上是个很简单的事情。当图片变多时,处理起来就有些麻烦了,很典型的应用场景,如ListView,GridView或者ViePager等。我们既需要保证用户看到更多的图片,以免屏幕出现大面积的空白,又要保证内存能Hold住。GC会自动释放一个没有强引用的图片或者View,这本来是个好事情,但为了让用户来回滚动时还能快速加载老图片,通...

weixin_34972620的博客 408

从询价到回款:一篇讲透 SAP SD 销售与分销的实战入门指南

摘要: SAP SD(Sales and Distribution)模块是SAP ERP中管理销售与分销的核心组件,贯穿从订单到回款(Order-to-Cash)的全流程。其核心价值在于将销售业务结构化,通过主数据(客户、物料、定价)和交易单据(订单、交货、发票)实现流程可审计、可自动化。SD模块与物流(MM)、生产(PP)、财务(FI)深度集成,涵盖定价策略、信用控制、发运管理、国际贸易等复杂场景。关键设计包括条件技术(Condition Technique)实现灵活定价,单据流(Document Flo

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 258

【科研数据获取】根据Excel表个中的企业/公司信息批量获取经纬度坐标,并进行地图可视化

批量获取企业/公司的经纬度坐标,并进行地图可视化1 需求2 实现途径3 需求逐步实现 1 需求 在做项目的时候,老板或者项目答辩时候甲方最喜欢看到的就是可视化结果,尤其是涉及到地图可视化。很多时候会遇到企业/公司的数据,想要做地图可视化,必不可少的就是要获取它们具体地址:第一种就是像查户口一样精准一下具体的城镇街道,还有一种就是经纬度信息,前一种属于文字内容往往用于管理方面,第二种数字信息多用于数据处理与分析。 2 实现途径 获取地理信息数据,自然需要使用到地图的功能,这里直接采用百度地图的拾取坐标系统,

lys_828的博客 2337

带你了解Android常见的内存缓存算法

带你了解Android常见的内存缓存算法本片博客主要简介以下两个问题 介绍一下常见的内存缓存算法 怎样实现这些算法 大家应该对ImageLoader这个框架都不陌生吧,一个很强大的图片加载框架,虽然作者去年的时候已经停止维护了,但里面的许多东西还是值得我们去学习的。本篇博客讲解的内存缓存算法正是基于ImageLoader的实现基础之上的常见的几种缓存算法 (1)LRU即Least RecentlyU

徐公,微信公众号同名 6948

迈瑞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

lihuapinghust的专栏 567

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Android Bitmap内存管理与高效加载实战指南

在Android应用开发中,图片处理是核心环节,而Bitmap作为图片在内存中的表示形式,其内存管理与加载优化直接关系到应用性能与用户体验。理解Bitmap的内存模型是关键,其内存占用由像素数据主导,计算公式为宽×高×每像素字节数,不当使用极易引发OOM(内存溢出)。高效加载的核心在于按需采样与缓存复用,通过BitmapFactory.Options的inSampleSize进行尺寸压缩,并结合LruCache构建内存缓存策略,能显著降低内存压力并提升加载速度。这些技术广泛应用于社交、电商等需要大量图片展示

weixin_33824363的博客 460

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Android内存管理与性能优化面试真题

概念解析:LRU算法的⼯程实现 LruCache(Least Recently Used,最近最少使⽤)是Android提供的⼀个核⼼缓存⼯具类。它的设计理念⾮常符合⼈类直觉:“如果⼀个数据最近被访问过,那么它在未来被访问的概率12 / 38极⾼;反之,如果⼀个数据很久没被碰过,当内存吃紧时,它就应该第⼀个被踢出局。” 在源码层⾯,LruCache 的底层⼼脏是⼀个 LinkedHashMap。

qq_52269550的博客 689

Glide手写实现之内存缓存

内存缓存 Glide中的内存缓存是二级缓存,当活动缓存中取不到资源的时候,再从内存缓存中取。内存缓存用的LRU算法缓存。其原理是当缓存已满再加入元素时最不常使用的元素会被移除。 LRU算法 LRU算法的原理比较简单,数据存储的数据结构为链表。当访问数据时,如缓存中有数据,则将该数据移动至链表的顶端;没有该数据则在顶端加入该数据,并移除链表中的低端的数据。 LRUCache Android的v4兼容...

吓成一坨兔子 427

android图片资源加载失败,Android图片加载库Picasso源码分析

图片加载在Android开发中是非常重要,好的图片加载库也比比皆是。ImageLoader、Picasso、Glide、Fresco均是优秀的图片加载库。以上提到的几种图片加载库各有特色。用法与比较,网上已经很多了。出于学习的角度,个人认为从Picasso入手较好。代码量小,同时API优美,很适合我们学习。今天笔者就Picasso的源码进行分析,抛出一些图片加载的技术细节供园友参考。PS:建议园友...

weixin_30388485的博客 464

基于Eclipse的Android应用开发实战:从MVC架构到完整项目构建

Android应用开发的核心在于理解其架构模式与工程化实践。经典的MVC(Model-View-Controller)架构清晰地分离了数据、界面与逻辑,为应用的可维护性奠定了基础。通过模块化设计与异步处理机制,开发者能够构建响应迅速、用户体验良好的应用。在工程实践中,数据持久化方案如SQLite数据库与SharedPreferences,以及多媒体处理如VideoView的视频播放,是实现核心功能的关键技术。这些技术共同支撑了在线教育、内容消费等复杂场景的应用开发。本文以“博学谷”这一综合性学习应用为例,详

weixin_30628801的博客 308

Android高性能AI日志库StatLog:结构化日志与性能监控实践

在移动应用开发中,日志记录是调试与性能监控的基础技术,其核心原理是通过记录程序运行时的状态与事件,帮助开发者理解应用行为。传统日志工具在记录方式上多为非结构化文本,难以进行自动化分析,尤其在面对高性能要求和复杂AI场景时,其I/O开销和字符串处理往往成为性能瓶颈。为了解决这一问题,现代日志库转向了结构化、语义化的设计范式,通过内存缓冲、异步处理和批量化输出等技术,将日志记录的性能开销降至最低。这种技术革新为应用性能监控(APM)和AI模型推理的深度可观测性提供了可能,使得开发者能够在不影响应用流畅度的前提下

weixin_34161083的博客 378

欢聚时代Android笔试题深度解析:核心考点与复习策略

在Android开发领域,无论是校招还是社招,面试官始终关注候选人对底层原理的理解深度。从Activity生命周期到Handler消息机制,再到自定义View的测量与绘制,这些看似基础的知识点,实则构成了Android客户端开发的核心地基。掌握这些原理,不仅有助于解决内存泄漏、界面卡顿等实际工程问题,还能在业务场景中做出更合理的技术选型。通过系统梳理历年大厂校招笔试题,可以发现考点与真实业务需求高度契合,例如直播应用中的任务栈管理、图片加载的缓存策略等。回归基础,理解概念背后的运行逻辑,是应对技术栈不断演进

weixin_30565327的博客 394

Glide WebP动图压缩技术:如何实现60%体积缩减与流畅加载体验

在移动应用开发中,动图加载性能直接影响用户体验和流量消耗。传统GIF格式动图体积庞大、解码效率低,已成为Android应用性能优化的瓶颈。Glide作为Android平台领先的图片加载库,通过WebP动图压缩技术,为开发者提供了高效的解决方案。本文将深入解析Glide WebP动图压缩的核心原理、实施路径和量化收益。 ### 技术痛点与解决方案 **传统动图加载面临三大挑战**: 1. **文

gitblog_00563的博客 425

Listview异步加载图片之优化篇

在 APP应用中,listview的异步加载图片方式能够带来很好的用户体验,同时也是考量程序性能的一个重要指标。关于listview的异步加载,网上 其实很多示例了,中心思想都差不多,不过很多版本或是有bug,或是有性能问题有待优化。有鉴于此,本人在网上找了个相对理想的版本并在此基础上进行改 造,下面就让在下阐述其原理以探索个中奥秘   贴张效果图先:          异步加载图片...

既是过河之卒,惟有奋力向前。 131

Midscene.js自动化脚本性能瓶颈深度解析:5个进阶优化方案解决卡顿问题

Midscene.js作为跨平台AI驱动的视觉自动化工具,在复杂任务场景下常面临性能瓶颈。本文将深入分析性能问题的根源,提供从架构到实践的完整优化方案,帮助开发者将自动化脚本执行效率提升3倍以上。 ## 🔍 第一部分:性能瓶颈深度诊断与根源分析 ### 1.1 图像处理:AI自动化中的最大性能消耗点 Midscene.js的核心性能瓶颈源于视觉AI模型的图像处理开销。每次自动化操作都需要进

gitblog_00472的博客 489

[Android] Glide核心逻辑解析

Glide核心逻辑解析 分三个模块进行,分别是Registry(注册器), Engine(请求),Cache(缓存)。 Registry模块 Registry的职责是注册Glide的所有组件,是Glide扩展的基石,目前在Registry中注册的组件有ModelLoaderFactory,ResourceDecoder, DataRewinder, Encoder。 我们看下个组件职责: Mod...

博客已搬家,请访问新博客https://kswapd.cn,提供更好的阅读体验。 1139

C#实现西门子PLC数据采集系统开发指南

工业自动化中的数据采集是智能制造的核心技术之一,通过PLC(可编程逻辑控制器)与SCADA系统的配合实现设备状态监控。现代工业场景对数据采集系统提出了更高要求,需要支持多种通信协议(如S7、OPC UA、Modbus TCP等)并具备高可靠性。C#凭借其高效的开发效率和丰富的类库支持,成为构建定制化数据采集系统的理想选择。本文以西门子S7系列PLC为例,详细解析如何使用C#开发具备断点续传、动态标签管理等高级功能的数据采集系统,并分享工业现场实施中的性能优化与异常处理经验。

weixin_33796205的博客 328
下一篇: Activity与Service通信(不同进程之间)
YLBF_DEV
博客等级 码龄12年 30粉丝 61原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值