- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我查看了 LRUCache 的官方 Android 文档,其中说:每次访问一个值时,它都会被移到队列的头部。当一个值被添加到一个完整的缓存中时,该队列末尾的值被逐出并且可能有资格进行垃圾收集。我想这是由缓存使用的 linkedhashmap 维护的双向链表。为了检查此行为,我检查了 LruCache 的源代码,并检查了 get(K key) 方法。它进一步调用 map 的 get 方法,该方法从底层 hashmap 获取值并调用 recordAccess 方法。
public V get(Object key) {
LinkedHashMapEntry<K,V> e = (LinkedHashMapEntry<K,V>)getEntry(key);
if (e == null)
return null;
e.recordAccess(this);
return e.value;
}
recordAccess 方法依次将访问的条目移动到列表的末尾,以防 accessOrder 设置为 true(对于我的问题,让我们假设它是),否则它什么都不做。
/**
* This method is invoked by the superclass whenever the value
* of a pre-existing entry is read by Map.get or modified by Map.set.
* If the enclosing Map is access-ordered, it moves the entry
* to the end of the list; otherwise, it does nothing.
*/
void recordAccess(HashMap<K,V> m) {
LinkedHashMap<K,V> lm = (LinkedHashMap<K,V>)m;
if (lm.accessOrder) {
lm.modCount++;
remove();
addBefore(lm.header);
}
}
这听起来与上面所说的元素被移动到队列头部的说法相矛盾。相反,它被移动到列表的最后一个元素(使用 head.before)。当然,我在这里遗漏了什么,有什么帮助吗?
最佳答案
你没有遗漏任何东西,只是你正在阅读 LinkedHashMap
的 LruCache
文档。 LinkedHashMap
有自己的文档,特别是关于它的 accessOrder
. (与 Java docs 相同)。
[...when accessOrder=true...] order of iteration is the order in which its entries were last accessed, from least-recently accessed to most-recently (access-order)
因此 LinkedHashMap
将最近使用的条目放在末尾,并记录在案。
实际上 LruCache
描述了这种缓存在理论上是如何工作的,但是 LinkedHashMap
展示了如何在不添加单独的向后移动迭代器的情况下实现它:通过将最近的元素放在最后, trimming可以使用已经可用的(向前移动的)迭代器来有效地访问(和删除)旧元素。
尽管此时此地我无法判断 removeEldestEntry
出了什么问题.也许过去不存在。
关于java - 使用 get 时 LRUCache 条目重新排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45074065/
我的应用程序中的多个 Activity 在 ListView 中显示图像,其中 ListView 的每一行都包含一个 ImageView. 这方面的一个示例是用户搜索、获取结果并显示每个结果的图片的搜
一 点睛 强引用(Strong Reference)是我们使用最多的一种对象引用,当一个对象被关键字 new 实例化出来的时候, JVM 会在堆(heap)内存中开辟一个内存区域,用于存放与该实例对应
我使用了代码 android lrucache example (Memory Cache)缓存下载的图像(总共将近 120 KB)并且它可以工作,但是当我从 Activity (或应用程序)中退出时
我正在阅读这篇文章来了解 Java 中的 LRUCache - Java LRU cache using LinkedList 这篇文章中有一个解决方案: public class LRUCache
我正在考虑为 Android 实现离线模式,但为了实现这一目标,我需要实现一个缓存系统。我读到人们建议 LruCache 并在这里看到了图像的示例 LruCache Example 。现在我不缓存图像
我正在尝试遵循有关 LruCache 使用的 2 年历史的 android 教程,到目前为止我在 Google 上搜索的一些示例具有相同的方法,即传递一个转换为 KiB 的值(int)。 final
我不能完全理解 LruCache 的内存管理组件。 从某种意义上说,我希望它能充当 iOS 平台上的 NSCache(最近刚刚从该操作系统中学到了一些知识)。 如果应用程序内存不足,LruCache
以下示例表明,在 LRUCache 之外分配新空间时,使用有限大小的 LRUCache 会导致 OutOfMemory 错误。 属性:64MB 进程大小; 10MB LRUCache 大小;我循环放入
我正在使用 LruCache 来缓存我的应用程序中使用的大量小 BitmapDrawables。问题是尺寸因我使用图像的不同位置而异。 我在从缓存中检索可绘制对象时设置边界,然后再将其设置为 Imag
我是 android 中 LruCache 的新手,我想在此缓存上放置和获取位图图像 (JPEG) 以防止内存错误和内存异常,所以我不明白为什么我的代码不起作用。这是我的代码: ImageView i
我已经在 Android 中实现了一个存储对象的标准 LRUCache。每个键都是与存储的对象关联的唯一 ObjectId。我的问题是从缓存中检索对象的唯一方法是通过 ObjectId(无迭代器)。实
final int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024); final int cacheSize = max
例如对 网络加载图片进行缓存 : ? 1
我尝试解决 LeetCode 中的问题,要求实现一个LRUCache。当我提交代码时,系统告诉我结果是错误答案。 由于测试用例太长,我在代码中找不到问题。当我选择“运行代码”来提交我的代码时,它是正确
我可以在 Cachetools 的 LRUCache 实现中使用多个/组合键吗?我想像下面这样使用它 def fun(a,b): pass x = LRUCache(maxsize=100,missi
我有一个 LRUCache,用于缓存缩略图和其他类似的小位图。目前,我在我的主要 Activity 中使用它,但是,我也想在我的其他 Activity 中使用它。这让我想知道将这个 LRUCache
我从 developer.android.com 上读到了关于使用 LruCache 的信息,我从一个 Activity 中创建了一个模糊的 Bitmap 并将其放入缓存中,现在我想访问来自另一个 A
我一直在尝试在我的应用程序中实现 LruCache,但我在连接点和在不同组件之间传递位图时遇到困难。 我想知道如何在我的应用程序中集成 LruCache。我也想了解实现 LruCache 的过程,所以
我正在尝试在 android 中使用 LruCache 来缓存一些图像,但它没有缓存 这是代码 int cacheSize1 = 4 * 1024 * 1024; // 4MiB bit
我有以下代码来缓存位图,当我尝试使用它们的键检索它们时。他们总是返回 null 。请帮我 。谢谢你 final int memClass = ((ActivityManager) mcontext.
我是一名优秀的程序员,十分优秀!