自定义ImageLoader

自定义简单版ImageLoader实现三级缓存 自定义简单版ImageLoader 实现三级缓存,主要用到了 LruCache 以及 DiskLruCache 和线程池 立即下载

LruCache的原理

                          1>首先理解LinkedHashMap

   理解LinkedHashMap的特性:

   一、可预知的迭代顺序
   二、迭代顺序,该迭代顺序可以是插入顺序或者是访问顺序。
   三、可以重写removeEldestEntry方法返回true值指定插入元素时移除最老的元素。 
           四、默认的情况下removeEldestEntry方法只返回false表示元素永远不过期。

java为数据结构中的映射定义了一个接口java.util.Map;它有四个实现类,分别是HashMap Hashtable LinkedHashMap 和TreeMap.

关于特性使用的方法:

           一、new  LinkedHashMap(10,0.75,true); 前面的两个参数就是HashMap构造函数需要的参数,后面的true表明LinkHashMap按照访问的次序来排序(accessOrder为true);
注意addBefore(lm.header)是将该entry放在header线性表的最后。(参考LinkedHashMap.Entry extends HashMap.Entry 比起HashMap.Entry多了before, after两个域,是双向的)
           二、

如果removeEldestEntry返回true,那么LinkedHashMap会自动删掉最不常用的那个entry(也就是header线性表最前面的那个)。

这会造成严重的性能问题吗?答案当然是否定的。因为在这儿的链表操作是常量级的。这也是LinkedHashMap/Set在这儿比TreeMap/Set性能更高的原因。

       三、

LinkedHashMap 是HashMap的一个子类,保存了记录的插入顺序,在用Iterator遍历LinkedHashMap时,先得到的记录肯定是先插入的.也可以在构造时用带参数,按照应用次数排序。在遍历的时候会比HashMap慢,不过有种情况例外,当HashMap容量很大,实际数据较少时,遍历起来可能会比 LinkedHashMap慢,因为LinkedHashMap的遍历速度只和实际数据有关,和容量无关,而HashMap的遍历速度和他的容量有关。


                二、LinkedHaspMap与LruCache的关联

一、该哈希映射的迭代顺序就是最后访问其条目的顺序,这种映射很适合构造构建Lru缓存,
LinkedHashMap提供removeEldestEctry(Map.Entry<k,V>    eldest)方法。该方法
提供在每次添加醉酒;
  * 当有新元素加入Map的时候会调用Entry的addEntry方法,会调用removeEldestEntry方法,
  * 这里就是实现LRU元素过期机制的地方,默认的情况下removeEldestEntry方法只返回false表示元素永远不过期。
二、
    if (eldest != header && removeEldestEntry(eldest)) {
        remove(eldest.key);
    }
    ......
	private static final int MAX_ENTRIES = 100;  
	protected boolean removeEldestEntry(Map.Entry eldest) {  
	    return size() > MAX_ENTRIES;  
	}
此方法通常不以任何方式修改映射,相反允许映射在其返回值的指引下进行自我修改。如果用此映射构建LRU缓存,则非常方便,它允许映射通过删除旧条目来减少内存损耗。
      例如:重写此方法,维持此映射只保存100个条目的稳定状态,在每次添加新条目时删除最旧的条目。

LruCache的处理方案优化:
图片被访问的频率有多高?会不会有一些图片的访问频率比其它图片要高?如果有的话,你也许应该让一些图片常驻在内存当中,或者使用多个LruCache 对象来区分不同组的图片。

                     三、LruCache的简介

一、你的设备可以为每个用于程序分配多大的内存?
二、设备屏幕上一次最多能显示多少张图片?有多少张图片需要进行预加载,以为
有可能很快会显示在屏幕上?
三、图片被访问的频率有多高?会不会有一些图片的访问频率比其它图片要高?如果有的话,你也许应该让一些图片常驻在内存当中,或者使用多个LruCache 对象来区分不同组的图片。
四、当向 ImageView 中加载一张图片时,首先会在 LruCache 的缓存中进行检查。如果找到了相应的键值,则会立刻更新ImageView ,否则开启一个后台线程来加载这张图片。

       

自定义ImageLoader


成员变量

1>图片下载的线程池名称

2>图片缓存最大数量

3>图片的KEY缓存

4>图片的缓存

5>图片下载的线程池

6>用于记录图片下载的任务,以便取消

7>图片的总大小


类中的方法

加载图片(load)

异步加载(asyncload)

取消下载(cancel)

从内存中加载[loadFromMemory(String url) ]

从本地设备中加载【loadFromLocal(String url)】

从网络加载图片【loadFormNet(String  url)】

从添加到内存 【addDrawableToMemory(String url,Drawable drawable)】

设置给控件图片 【setImageSafe(final ImageView view,final String url,final Drawable  drawable)】



//从本地设备中加载

一般对图片进行处理有BitmapFactory.decodeByteArray(data,offset,length),BitmapFactory.decodeFile(pathName),

BitmapFactory.decodeStream(is);上面三个分析源码可知,他们都是在Java层创建byte数组,然后把数据传递给本地代码,

而 BitmapFactory.decodeFileDescriptor();

是把文件描述符传递给本地代码,由本地代码去创建图片

注意:

1》内存不足是会把bitmap的数组回收掉,但我们的bitmap不会被回收,当你再次显示的时候,发现bitmap的数组为空时,将会再次根据文件描述符去加载图片,此时可能由于加载耗时造成界面卡顿,但总比OOM要好很多。

2》本地代码在创建图片时,没有对图片进行校验,所以如果文件不完整,或者根本不是一个图片时,系统也不会报错,仍然会返回一个bitmap,但是这个bitmap是一个纯黑色的bitmap;那我们需要在下载图片的时候,一定要先以一个临时文件下载,等下载完毕了,再对图片进行重命名。


//从内存中加载

从内存中获取到了,需要重新放到内存队列的最后

LUC: 一般缓存算法有两种,第一种是LFU,按使用次数来判断删除优先级,使用次数最少的最先删除;还有

一个就是LRC,按照使用时间来判断删除的优先级,最后使用时间越早的最先删除。

这两种算法的原理请看此文章第一节部分。


案例下载:

http://download.youkuaiyun.com/detail/javamov/9041621



















                             
OCS2 移动机械臂深度解析:ocs2_mobile_manipulator 与 ocs2_mobile_manipulator_ros 源码全拆解 摘要:本文深入解析OCS2移动机械臂MPC控制框架的两个核心工具包。ocs2_mobile_manipulator负责算法建模,通过MobileManipulatorInterface统一构建最优控制问题,支持4种机械臂模型并实现自动维度推导;ocs2_mobile_manipulator_ros负责ROS集成,包含MPC求解、虚拟跟踪等4个核心节点。文章详细剖析了工具包分工、最优控制建模架构(含动力学、代价约束设计)、ROS运行管线、参数配置映射,并提供了高效的源码阅读顺序建议,帮助开发者快速掌握移动机械 阅读详情

相关推荐

基于PDF文档结构的数字隐写

PDF隐写

xiongshivigor的博客 1426

Android中使用ImageLoader加载图片

Android上让人头疼的莫过于从网络上获取图片,然后显示图片,最后还要考虑到图片的回收问题,这之间只要有任何一个环节有问题都可能直接OOM。尤其在需要展示图片的列表页面,会加载大量网络上的图片,每当快速滑动列表的时候,都会很卡,甚至会因为内存溢出而崩溃。 这时就是ImageLoader的 show time 了。ImageLoader的目的是为了实现异步的网络图片加载、缓存及显示,支持多线程异步

活在当下!输出快乐! 9091

GD32F4系列替换STM32F4,HAL库CAN初始化卡死?一个Sleep模式的坑与填坑实录

本文详细解析了GD32F4系列替换STM32F4时,HAL库CAN初始化卡死的问题根源——Sleep模式差异。通过对比两款芯片CAN控制器的默认状态,提出了不修改HAL库源码的解决方案,即在HAL_CAN_MspInit()中清除SLEEP位,并分析了该方法的优势。文章还提供了国产MCU替换的通用建议和调试技巧,帮助开发者高效解决问题。

weixin_29174013的博客 218

Android——自定义简化版ImageLoader

在上一篇我们已经先后介绍了 Bitmap 的高效加载方式、LruCache 以及 DiskLruCache,那么我们就动手来写一个简化版的 ImageLoader 吧!!!一般来说,一个优秀的 ImageLoader 应该具备如下功能: 图片的同步加载 图片的异步加载 图片的压缩 内存缓存 磁盘缓存 网络拉取 声明一下,这里实现的 ImageLoader 并不是为了写一个框架,而是纯粹的加深下三级缓

AkaiC的博客 1009

WorkBuddy Skill赋能HYSYS与Comsol:AI工作台下的仿真自动化实践

AI Agent正将工业软件自动化带向新高度。在工程仿真领域,流程模拟与多物理场分析常因重复性操作而效率低下,Aspen HYSYS的批量工况调整、Comsol的参数扫描与网格重构均属此类。WorkBuddy这类AI工作台通过Skill将软件二次开发能力封装为可插拔技能包,利用HYSYS的COM/OLE接口和Comsol的Java API,实现自然语言指令到自动化执行的转变。其技术价值在于降低自动化门槛、沉淀工程经验,并支持日志审计与异常重试。在实际应用中,无论化工流程的灵敏度分析,还是激光焊接、移动网格等

weixin_29055699的博客 303

SolidWorks + AI:利用 DeepSeek AI 自动生成 VBA Macro 宏,实现智能化建模!

本教程介绍如何将集成到插件,实现的自动化操作。通过 DeepSeek AI,您可以快速生成高效的,提升!💡。

SolidWorksAPI的专栏 1万+

ImageLoader(UIL)自定义HTTP Header信息

最近的项目,在加载图片时需要用户的身份信息,服务器端将用户的信息采用Session的方式保存。 那怎样为将SessionId加入到ImageLoader请求的中去呢? 1.首先自定义一个Downloader public class ImageLoaderWithCookie extends BaseImageDownloader { public ImageLoaderWithCo

easion_zms的专栏 2324

海康线扫相机平场矫正教程

1、白纸准备确保视野中有一张平整且无折痕的白纸,使其完全铺满相机的整个视野。2、行高设置将行高参数设定为 2048。3、灰度值控制相机端图像的灰度值应维持在 120 - 160 这个区间内。同时,最亮像素点与最暗像素点的灰度值差值不得超过 4 倍。在调整灰度值时,尽量开启增益功能。4、 图像模糊处理为减少白纸对平场矫正的影响,需将相机端获取的图像进行模糊化处理。具体操作是对镜头进行虚焦,使整体图像变得模糊。

T 2756

ImageLoader+自定义ImageView圆形图片

效果ImageLoader的使用是加入依赖的三个jar包 MainActivitypackage com.example.testimageloader;import com.nostra13.universalimageloader.core.DisplayImageOptions; import com.nostra13.universalimageloader.core.ImageLoade

冬眠FF的博客 1257

Calibre 3Dstack --每日一个命令day27【overlap】(3-27)

本文介绍了Calibre3Dstack中overlap命令的使用方法。该命令用于检查两个已放置层之间的重叠量是否符合要求,支持设置检查名称、层类型、堆叠范围、检查方向等参数。关键参数包括:-constraint指定重叠约束条件,-exact控制百分比精度,-by_area切换为面积检查模式,-intersection报告相交区域。检查结果可通过RVE选项定制显示方式,适用于3D堆叠设计中的层间重叠验证场景。

u013620135的博客 112

SAP Fiori 从技术上而言到底包含哪些组件?

SAP Fiori是企业级UX设计的系统化解决方案,基于五大原则构建:角色导向(Role-based)、自适应(Adaptive)、简洁(Simple)、一致(Coherent)和愉悦(Delightful)。其技术实现包含SAPUI5开发框架、Fiori Launchpad统一入口、OData服务网关等核心组件,通过标准化设计模式与开发工具链,显著提升企业应用的用户体验和开发效率。典型案例显示,遵循Fiori原则可缩短30%以上的操作时长,降低50%的培训成本。该体系既保持跨设备一致性,又支持业务场景的深

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

ImageLoader中自定义Displayer来展示任意圆角

ImageLoader自带圆角图片的RoundedBitmapDisplayer,但这个displayer展示的效果是4个角都是圆角,而我们有时候只需要其中的上面或下面2个角是圆角,本篇就是讲这个方法的。package com.uil;import android.graphics.Bitmap; import android.graphics.BitmapShader; import androi

zhujiangtaotaise的专栏 586

TIA博途中通过UDT实现IO地址映射到DB块中的具体方法

TIA博途中通过UDT实现IO地址映射到DB块中的具体方法

Robot_PLC_HMI_Automation 1万+

ImageLoader加载图片 默认方式和自定义方式

public class MyApplication extends Application{ @Override public void onCreate() { // TODO Auto-generated method stub super.onCreate(); //默认的方式 //ImageLoaderConfiguration configuration=Image

zixinfei的博客 4817

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

ImageLoader加载图片 默认方式和自定义方式

public class MyApplication extends Application{ @Override public void onCreate() { // TODO Auto-generated method stub super.onCreate(); //默认的方式 //ImageLoaderConfiguration configuration=Image

longfei_2010的博客 345

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

imageLoader自定义配置

package com.example.viewpager_lunbo; import android.content.Context; import com.nostra13.universalimageloader.cache.disc.impl.UnlimitedDiskCache; import com.nostra13.universalimageloader.cache.disc.

ztz的博客 345

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

ImageLoader自定义目录 加 开关缓存+配置图片 图形

public class Net_ImageLoader extends Application { @Override public void onCreate() { super.onCreate(); ImageLoaderConfiguration build = new ImageLoaderConfiguration.Builder(th...

weixin_44272685的博客 139

自定义ImageLoader类

初级时在ListView或是GridView中需要处理大量图片时,创建的一个单独类。ImageLoader类,来实现ListView或是GridView双缓存(一级,二级)异步(AsyncTask相当于新线程) 异步:AsyncTask来实现。 双缓存: 一级缓存LinkedHashMap(LRU(Least RecentlyUsed)策略,即当内存使用不足时,把最近最少使用的...

听海的博客 617

Android知识总结:Universal-Imageloader学习笔记3 显示自定义形状头像

显示自定义形状       昨天我们分析了ImageLoader的主业务流程,现在我们把它应用到项目的实践中。         项目中我们需要显示圆形图片,带圆角的图片,以及图片上叠加其他标记,我们可以分别制作相应的自定义控件, ImagerLoader为我们建立了BitmapDisplayer,实现这个接口并将其设置到下载options中。        在Ima

lidec的专栏 1046

Android 自定义 ImageLoader

import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.

liulipuo的专栏 1303

自定义ImageLoader实现GridView加载图片

本项目github地址: SimpleImageLoader github地址 首先思考一下,一个ImageLoader应当实现一下的功能: 1 内存缓存,磁盘缓存,网络加载的结合。 2 利用采样率对图片进行一定的压缩,高效加载bitmap。 3 图片的加载策略(同步加载和异步加载)。 4 缓存策略(LRU) 其次在GridView中加载图片,应当解决下面的这些问题: 5 图片错位

安东尼的博客 988

OKHTTP,RecycleView,ImageLoader,Glide,自定义VIew

依赖:compile 'com.android.support:recyclerview-v7:21.0.+' compile 'com.youth.banner:banner:1.4.9' compile 'com.nostra13.universalimageloader:universal-image-loader:1.9.5' compile 'com.google.code.gson:g

PowerSen的博客 450

Imageloader的配置及显示(自定义路径)

public static void init(Context context) { //在SD卡中创建一个目录 File file = new File(Environment.getExternalStorageDirectory(), "image"); if(file.exists()){ file.mkdirs(); } File

爱喝柠檬的傻蛋的博客 1537
上一篇: 面向对象编程(OOP)
下一篇: Java设计模式--工厂模式
linuxMinx
博客等级 码龄15年 195粉丝 79原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值