lrucache

Android使用 LruCache 缓存图片

点点圈 提交于 2019-12-03 00:03:14
使用图片缓存技术 在你应用程序的UI界面加载一张图片是一件很简单的事情,但是当你需要在界面上加载一大堆图片的时候,情况就变得复杂起来。在很多情况下,(比如使用ListView, GridView 或者 ViewPager 这样的组件),屏幕上显示的图片可以通过滑动屏幕等事件不断地增加,最终导致OOM。 为了保证内存的使用始终维持在一个合理的范围,通常会把被移除屏幕的图片进行回收处理。此时垃圾回收器也会认为你不再持有这些图片的引用,从而对这些图片进行GC操作。用这种思路来解决问题是非常好的,可是为了能让程序快速运行,在界面上迅速地加载图片,你又必须要考虑到某些图片被回收之后,用户又将它重新滑入屏幕这种情况。这时重新去加载一遍刚刚加载过的图片无疑是性能的瓶颈,你需要想办法去避免这个情况的发生。 这个时候,使用内存缓存技术可以很好的解决这个问题,它可以让组件快速地重新加载和处理图片。下面我们就来看一看如何使用内存缓存技术来对图片进行缓存,从而让你的应用程序在加载很多图片的时候可以提高响应速度和流畅性。 内存缓存技术对那些大量占用应用程序宝贵内存的图片提供了快速访问的方法。其中最核心的类是LruCache (此类在android-support-v4的包中提供) 。这个类非常适合用来缓存图片,它的主要算法原理是把最近使用的对象用强引用存储在 LinkedHashMap 中

Android LruCache 缓存图片

断了今生、忘了曾经 提交于 2019-12-03 00:02:57
使用图片缓存技术 在 你应用程序的UI界面加载一张图片是一件很简单的事情,但是当你需要在界面上加载一大堆图片的时候,情况就变得复杂起来。在很多情况下,(比如使用 ListView, GridView 或者 ViewPager 这样的组件),屏幕上显示的图片可以通过滑动屏幕等事件不断地增加,最终导致OOM。 为了保证内存的使用始终维持在一个合理的范围,通常会把被移除屏幕的图片进行回收处理。此时垃圾回收器也会认为你不再持有这些图片的引用,从而对这些图片 进行GC操作。用这种思路来解决问题是非常好的,可是为了能让程序快速运行,在界面上迅速地加载图片,你又必须要考虑到某些图片被回收之后,用户又将它重 新滑入屏幕这种情况。这时重新去加载一遍刚刚加载过的图片无疑是性能的瓶颈,你需要想办法去避免这个情况的发生。 这个时候,使用内存缓存技术可以很好的解决这个问题,它可以让组件快速地重新加载和处理图片。下面我们就来看一看如何使用内存缓存技术来对图片进行缓存,从而让你的应用程序在加载很多图片的时候可以提高响应速度和流畅性。 内存缓存技术对那些大量占用应用程序宝贵内存的图片提供了快速访问的方法。其中最核心的类是LruCache (此类在android-support-v4的包中提供) 。这个类非常适合用来缓存图片,它的主要算法原理是把最近使用的对象用强引用存储在 LinkedHashMap 中

LRUCache c#

匿名 (未验证) 提交于 2019-12-02 22:10:10
LRUCache是Least Recently Used 近期最少使用算法的缓存,是android提供的一个缓存工具类。可以以两种排序方式来输出缓存,一种是按插入顺序输出,一种是按最近最少方式输出,最近使用的放在队首,使用频率低的,间隔时间最长的放在队尾。 下面是实现 using System; using System.Collections.Generic; namespace LY.Helper { public class LRUCache<T> { private Dictionary<string, T> dict; private LinkedList<T> list; private int size = 0; private bool isSequence = false; public LRUCache(int sz):this(sz,false) { } public LRUCache(int sz, bool isSq) { isSequence = isSq; size = sz < 10 ? 10 : sz; dict = new Dictionary<string, T>(size); list = new LinkedList<T>(); } public int Size { get { return size; } set { size =

java中的四种引用

匿名 (未验证) 提交于 2019-12-02 21:53:52
Java内存管理包括内存分配和内存回收。 内存分配:程序员通过new对象,JVM会自动为该对象分配内存。 内存回收:Java在JVM虚拟机上增加了垃圾回收(Garbage Collection)机制,用以在合适的时间触发垃圾回收,将不需要的内存空间回收释放,避免无限制的内存增长导致的OOM. 其实GC时主要看这个对象是否有引用指向该对象。按照这种引用的强弱的关系, 从JDK1.2版本开始,把对象的引用分为四种级别,从而使程序能更加灵活的控制对象的生命周期。这四种级别由高到低依次为:强引用、软引用、弱引用和虚引用。 四种引用 强引用(StrongReference) 是指创建一个对象并把这个对象赋给一个引用变量。比如 Object tv = new Object(); 强引用有引用变量指向时永远不会被垃圾回收,JVM宁愿抛出OutOfMemory错误也不会回收这种对象。 如果程序确实不在用到某个强引用变量,通常可以手动将这个引用指向赋值为null。比如常见的集合中 claer() 方法。下面这段代码就是 ArrayList 的 clear() /** * Removes all of the elements from this list. The list will * be empty after this call returns. */ public void clear (

Glide——缓存分析整理

假如想象 提交于 2019-12-02 11:55:50
文章目录 LruCache 概述 原理 DiskLruCache 概述 Glide缓存概述 资源分类 缓存设计 Glide 缓存源码分析 1、生成key 2、创建缓存对象LruResourceCache 3、获取内存缓存中的图片 4、开启加载图片线程 5、获取磁盘缓存 6、写入磁盘 7、写入内存缓存 写入弱引用缓存 写入LruCache LruCache 概述 LruCache是Android 3.1所提供的一个缓存类,所以在Android中可以直接使用LruCache实现内存缓存。 主要算法原理是把最近使用的对象用强引用(即我们平常使用的对象引用方式)存储在 LinkedHashMap 中。当缓存满时,把最近最少使用的对象从内存中移除,并提供了get和put方法来完成缓存的获取和添加操作。 简单使用 int maxMemory = ( int ) ( Runtime . getRuntime ( ) . totalMemory ( ) / 1024 ) ; int cacheSize = maxMemory / 8 ; mMemoryCache = new LruCache < String , Bitmap > ( cacheSize ) { @Override protected int sizeOf ( String key , Bitmap value ) {

GuavaCache学习笔记一:自定义LRU算法的缓存实现

馋奶兔 提交于 2019-12-02 06:35:59
随笔 - 169 文章 - 0 评论 - 292 GuavaCache学习笔记一:自定义LRU算法的缓存实现 前言 今天在看GuavaCache缓存相关的源码,这里想到先自己手动实现一个LRU算法。于是乎便想到LinkedHashMap和LinkedList+HashMap, 这里仅仅是作为简单的复习一下。 LRU LRU(Least recently used,最近最少使用)算法根据数据的历史访问记录来进行淘汰数据,其核心思想是“如果数据最近被访问过,那么将来被访问的几率也更高”。 代码实现原理 LinkedList + HashMap: LinkedList其实是一个双向链表,我们可以通过get和put来设置最近请求key的位置,然后hashMap去存储数据 LinkedHashMap:LinkedHashMap是继承自HashMap,只不过Map中的Node节点改为了双向节点,双向节点可以维护添加的顺序,在LinkedHashMap的构造函数中有一个accessOrder, 当设置为true后,put和get会自动维护最近请求的位置到last。 LinkedList+HashMap代码实现 LRUCache接口: /** * @Description: * @Author: wangmeng * @Date: 2018/12/8-10:49 */ public class

高效使用Bitmaps(三) 神奇的Cache

独自空忆成欢 提交于 2019-12-01 19:43:40
应用的场景 假设你开发了一个聊天程序,它的好友列表中显示从网络获取的好友头像。可是如果用户发现每次进入好友列表的时候,程序都要重新下载头像才能进行显示,甚至当把列表滑动到底部再重新滑动回顶部的时候,刚才已经加载完成了的头像竟然又变成了空白图片开始重新加载,这将是一种糟糕的用户体验。为了解决这种问题,你需要使用高速缓存技术——Cache。 什么是Cache? Cache,高速缓存,原意是指计算机中一块比内存更高速容量更小的存储器。更广义地说,Cache指对于最近使用过的信息的可高速读取的存储块。而本文要讲的Cache技术,指的就是将最近使用过的Bitmap缓存在手机的内存与磁盘中,来实现再次使用Bitmap 时的瞬时加载,以节省用户的时间和手机流量。 下面将针对Android中的两种Cache类型Memory Cache和Disk Cache分别进行介绍。样例代码取自 Android开发者站 。 1/2:Memory Cache ( 内存中的Cache ) Memory Cache使用内存来为应用程序提供Cache。由于内存的读写速度非常快,所以我们应该优先使用它(相对于下面将介绍的Disk Cache来说)。 Android中提供了 LruCache 类来进行Memory Cache的管理(该类是在Android 3.1时推出的,但我们可以使用 android -support

浅析LRUCache原理(Android)

旧城冷巷雨未停 提交于 2019-12-01 17:13:21
一. LruCache基本原理 LRU全称为Least Recently Used,即最近最少使用。 由于缓存容量是有限的,当有新的数据需要加入缓存,但缓存的空闲空间不足的时候,如何移除原有的部分数据从而释放空间用来放新的数据? LRU算法就是当缓存空间满了的时候,将最近最少使用的数据从缓存空间中删除以增加可用的缓存空间来缓存新数据。 这个算分的内部有一个缓存列表,每当一个缓存数据被访问的时候,这个数据就会被提到列表尾部,每次都这样的话,列表的头部数据就是最近最不常使用的了,当缓存空间不足时,就会删除列表头部的缓存数据。 二. LruCache的使用 //获取系统分配给每个应用程序的最大内存 int maxMemory=(int)(Runtime.getRuntime().maxMemory()/1024); int cacheSize=maxMemory/8; private LruCache<String, Bitmap> mMemoryCache; //给LruCache分配1/8 mMemoryCache = new LruCache<String, Bitmap>(mCacheSize){ //重写该方法,来测量Bitmap的大小 @Override protected int sizeOf(String key, Bitmap value) { return value

安卓图片的异步请求及使用LruCache缓存和手机内存两层存储图片,避免重新加载页面带来的重新请求

我只是一个虾纸丫 提交于 2019-12-01 15:37:26
看到网友的一片技术博客讲解了LruCache的使用,我把它加到了我的项目中,但是加入断点发现,列表上下滑动时,确实可以不用重新加载图片,但是重新打开这个activity或者重新启动应用, LruCache的缓存都不再存在,而需要重新联网下载,所有我对这个方法加以改进,加入了一层往手机内存存储图片的过程。 这样的话,使用图片时,先从 LruCache中加载,如果 LruCache中不存在该图片资源的话, 再从手机存储中进行加载,如果同样不存在,则先显示一个默认图片。 另一方面,我的项目使用图片的是listview,在它滑动的时候,不进行请求图片的操作,以免浪费不必要的流量,在它不滑动的时候,会检查哪些图片没有在手机存储中,进行异步请求,并将返回的bitmap同时存储在LruCache和手机存储中。 下面是关键代码,其中有一些是我项目中的变量,可以忽略: public class TaocanListAdapter extends BaseAdapter implements OnScrollListener{ /** * 记录所有正在下载或等待下载的任务。 */ private Set<BitmapWorkerTask> taskCollection; /** * 图片缓存技术的核心类,用于缓存所有下载好的图片,在程序内存达到设定值时会将最少最近使用的图片移除掉。 */

Android内存优化之内存缓存

烂漫一生 提交于 2019-12-01 15:37:07
什么是缓存? 缓存技术原理就是把用户访问的所有对象看作一个全集,经过算法标记哪些是用户经常访问的对象,把这些对象放到一个集合里,这个集合是全集一个子集,下一次用户再访问的时候会先从这个子集集合中查找用户要访问的对象如果找到就直接返回这个对象,如果没有找到则再去全集中查找。当然了我这里说的只是原理性的东西,缓存是有很多算法的,并且有的不止一级缓存,这里就不过多讲了。 为什么要用到缓存? 有缓存的话可以不必每次从源地址读取文件,既节省了时间也节省了流量。尤其是手机设备,频繁的访问网络资源会消耗很多用户的流量和电量,这是用户不能忍受的,所以无论从哪个方面考虑应用程序都必须加上缓存。 Android 中的图片缓存有哪些?各有什么特点? Android 设备的图片缓存分两种,一种是内存缓存,图片缓存在设备的内存中,一种是外部缓存,图片缓存在磁盘上,磁盘可以是内部的存储空间也可以是外部的 sd 卡。这两种缓存各有各的优点,内存缓存优点是快,缺点是因为也是读取到内存中所以也会消耗内存,所以不能太大,用的时候要考虑分配的空间,还有一个缺点是应用重启后就会消失。外部缓存的优点是可以长久保存大量的数据 ( 相比较内存缓存而言 ) ,缺点就是慢。 内存缓存: 在 Android 中官网推荐使用 LruCache 作为内存缓存, LruCache 实际上就是一个 LinkedHashMap( 补充知识: