lrucache

listView加载显示图片(缓存)

浪尽此生 提交于 2020-02-11 19:50:52
我用的是异步加载图片的方式,并且使用了缓存的方式。 1、这是继承了AsyncTask<String, Void, Bitmap>的MyTask类,用异步加载图片 public class MyTask extends AsyncTask<String, Void, Bitmap> { private ImageView imageView; private LruCache<String, Bitmap> lruCache; /** * 构造方法,需要把ImageView控件和LruCache对象传进来 * * @param imageView * 加载图片到此 * @param lruCache * 缓存图片的对象 */ public MyTask(ImageView imageView, LruCache<String, Bitmap> lruCache) { super(); this.imageView = imageView; this.lruCache = lruCache; } /** * 调用LruCache的put 方法将图片加入内存缓存中,要给这个图片一个key 方便下次从缓存中取出来 * * @param key * @param bitmap */ private void addBitmapToMemoryCache(String key, Bitmap

LeedCode_LRU缓存机制

谁说胖子不能爱 提交于 2020-01-21 17:34:24
LeedCode_LRU缓存机制 题目说明 运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制。它应该支持以下操作: 获取数据 get 和 写入数据 put 。获取数据 get(key) - 如果密钥 (key) 存在于缓存中,则获取密钥的值(总是正数),否则返回 -1。 写入数据 put(key, value) - 如果密钥不存在,则写入其数据值。当缓存容量达到上限时,它应该在写入新数据之前删除最近最少使用的数据值,从而为新的数据值留出空间。 LRUCache cache = new LRUCache( 2 /* 缓存容量 */ ); cache.put(1, 1); cache.put(2, 2); cache.get(1); // 返回 1 cache.put(3, 3); // 该操作会使得密钥 2 作废 cache.get(2); // 返回 -1 (未找到) cache.put(4, 4); // 该操作会使得密钥 1 作废 cache.get(1); // 返回 -1 (未找到) cache.get(3); // 返回 3 cache.get(4); // 返回 4 链接: https://leetcode-cn.com/problems/lru-cache 分析:采用双链表的方式,每次查询,自动擦除缓存,重新插入数据

LruCache的缓存策略

怎甘沉沦 提交于 2019-12-18 09:51:18
一、Android中的缓存策略 一般来说,缓存策略主要包含缓存的添加、获取和删除这三类操作。如何添加和获取缓存这个比较好理解,那么为什么还要删除缓存呢?这是因为不管是内存缓存还是硬盘缓存,它们的缓存大小都是有限的。当缓存满了之后,再想其添加缓存,这个时候就需要删除一些旧的缓存并添加新的缓存。 因此LRU(Least Recently Used)缓存算法便应运而生,LRU是近期最少使用的算法,它的核心思想是当缓存满时,会优先淘汰那些近期最少使用的缓存对象。采用LRU算法的缓存有两种:LrhCache和DisLruCache分别用于实现内存缓存和硬盘缓存,其核心思想都是LRU缓存算法。 二、LruCache的使用 LruCache是Android 3.1所提供的一个缓存类,所以在Android中可以直接使用LruCache实现内存缓存。而DisLruCache目前在Android 还不是Android SDK的一部分,但Android官方文档推荐使用该算法来实现硬盘缓存。 1.LruCache的介绍 LruCache是个泛型类,主要算法原理是把最近使用的对象用强引用(即我们平常使用的对象引用方式)存储在 LinkedHashMap 中。当缓存满时,把最近最少使用的对象从内存中移除,并提供了get和put方法来完成缓存的获取和添加操作。 2.LruCache的使用

手写一个LruCache

此生再无相见时 提交于 2019-12-05 07:17:04
代码实现一 (直接继承ListHashMap.java) package org.java.write.lru; import java.util.ArrayList; import java.util.Collection; import java.util.LinkedHashMap; import java.util.Map; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class LRULinkedHashMap<K, V> extends LinkedHashMap<K, V> { private final int maxCapacity; private static final float DEFAULT_LOAD_FACTOR = 0.75f; private final Lock lock = new ReentrantLock(); public LRULinkedHashMap(int maxCapacity) { super(maxCapacity, DEFAULT_LOAD_FACTOR, true); this.maxCapacity = maxCapacity; } /

常见算法学习-LRU

|▌冷眼眸甩不掉的悲伤 提交于 2019-12-05 05:35:01
Least Frequently Used 😆 简单原理和实现参考: 漫画:什么是LRU算法 简单版本 可以使用JDK自带的 LinkedHashMap 数据结构来实现 方法说明 //LinkedHashMap的一个构造函数,当参数accessOrder为true时,即会按照访问顺序排序,最近访问的放在最前,最早访问的放在后面 public LinkedHashMap(int initialCapacity, float loadFactor, boolean accessOrder) { super(initialCapacity, loadFactor); this.accessOrder = accessOrder; } //LinkedHashMap自带的判断是否删除最老的元素方法,默认返回false,即不删除老数据 //我们要做的就是重写这个方法,当满足一定条件时删除老数据 protected boolean removeEldestEntry(Map.Entry<K,V> eldest) { return false; } 实现方式 final int cacheSize = 100; Map<String, String> map = new LinkedHashMap<String, String>((int) Math.ceil(cacheSize / 0.75f

Android照片墙应用实现,再多的图片也不怕崩溃

只谈情不闲聊 提交于 2019-12-05 04:00:49
转载请注明出处: http://blog.csdn.net/guolin_blog/article/details/9526203 照片墙这种功能现在应该算是挺常见了,在很多应用中你都可以经常看到照片墙的身影。它的设计思路其实也非常简单,用一个GridView控件当作“墙”,然后随着GridView的滚动将一张张照片贴在“墙”上,这些照片可以是手机本地中存储的,也可以是从网上下载的。制作类似于这种的功能的应用,有一个非常重要的问题需要考虑,就是图片资源何时应该释放。因为随着GridView的滚动,加载的图片可能会越来越多,如果没有一种合理的机制对图片进行释放,那么当图片达到一定上限时,程序就必然会崩溃。 今天我们照片墙应用的实现,重点也是放在了如何防止由于图片过多导致程序崩溃上面。主要的核心算法使用了Android中提供的LruCache类,这个类是3.1版本中提供的,如果你是在更早的Android版本中开发,则需要导入android-support-v4的jar包。 关于LruCache用法的详细讲解,可以参考 Android高效加载大图、多图方案,有效避免程序OOM 。 那我们开始动手吧,新建一个Android项目,起名叫PhotoWallDemo,这里我使用的是Android 4.0的API。 第一个要考虑的问题就是,我们从哪儿去收集这么多的图片呢

java基础-怎么实现LRU算法

时光毁灭记忆、已成空白 提交于 2019-12-04 20:38:47
1 public class LRUCache<K, V> extends LinkedHashMap<K, V> { 2 private final int CACHE_SIZE; 3 4 public LRUCache(int cacheSize){ 5 super((int)Math.ceil(cacheSize / 0.75) + 1,0.75f,true); 6 CACHE_SIZE = cacheSize; 7 } 8 9 @Override 10 protected boolean removeEldestEntry(Map.Entry<K, V> entity) { 11 return size() > CACHE_SIZE; 12 } 13 14 public static void main (String...args){ 15 var cache = new LRUCache<Long,String>(5); 16 cache.put(1L,"1L"); 17 cache.put(2L,"2L"); 18 cache.put(3L,"3L"); 19 cache.put(4L,"4L"); 20 cache.put(5L,"5L"); 21 System.out.println(cache); 22 cache.put(6L,"6L"); 23 cache

LruMemoryCache和LruCache

こ雲淡風輕ζ 提交于 2019-12-03 04:10:22
#LruMemoryCache和LruCache 在UniversalImageLoader中缓存在内存中的数据就使用了LruCache类,叫LruMemoryCache,存在内存中的图片就是放在该类中了,想想早年我们用软引用的方式保存,也是弱爆了... Lru Lru(Least recently used,最近最少使用)是一个缓存淘汰算法的简写,如果数据长时间没有被访问,那么缓存数据容量满的的时候,将会淘汰最少使用的数据。 我们直接看LruMemoryCache的代码。 /** * A cache that holds strong references to a limited number of Bitmaps. Each time a Bitmap is accessed, it is moved to * the head of a queue. When a Bitmap is added to a full cache, the Bitmap at the end of that queue is evicted and may * become eligible for garbage collection.<br /> * <br /> * <b>NOTE:</b> This cache uses only strong references for

LRU算法的实现

匿名 (未验证) 提交于 2019-12-03 00:11:01
需求 随着公司的业务越来越复杂,需要提供一个用户系统,供各个业务系统来查询用户的基本信息。且业务方对用户信息的查询频率很高,设计的用户系统需要注意性能。 初始设计 : 考虑到性能,可以在内存中创建一个哈希表作为缓存,每当查找一个用户时,会现在哈希表中进行查询,查询不到再去数据库查询。 初始设计 存在的问题 : 随着用户量不断增大,可能会因为哈希表逐渐增大导致内存某一天会被撑爆。 初始设计的优化 : 使用LRU算法(内存管理算法,Least Recently Used),最近最少使用的思想。算法基于一种假设:长期不被使用的数据,在未来被用到的几率也不大。因此,当数据所占内存达到一定阈值时,我们要移除掉最近最少被使用的数据。 LRU算法 在LRU算法中,使用一种叫作“哈希链表”的数据结构。哈希表由若干个key-value组成,逻辑上这些key-value是无所谓排序的。但在哈希链表中,这些key-value被一个链条串在一起,不再是无序的了,而是有 了固定的排列顺序。每一个key-value都有前驱key-value、后继key-value。所以我们可以把key-value按照最后使用的时间来进行排序。链表的尾部是最近被使用的,头部是最近被使用最少甚至没有被使用过的key-value。所以,当缓存容量达到上限时,会先删除链表最左端的值,再把新的值插入到链表的最右端。 LRU算法实现

android如何释放图片缓存

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