Android api level-22中android.support.v4.util.LruCache和android.util.LruCache的行为不一样问题

今天发现一个问题,ApiLevel-22的Android源码,两个版本的LruCache:android.support.v4.util.LruCache和android.util.LruCache在移除旧的缓存对象时的行为完全不一样。

android.support.v4.util.LruCache在移除缓存的时候是移除最近最少访问的,符合LruCache的设计初衷。

android.util.LruCache在缓存满了的情况下,会把当前加入的直接移除掉,不符合LruCache的设计初衷。

关键代码如下:

android.support.v4.util.LruCache,第15行代码

 1     private void trimToSize(int maxSize) {
 2         while (true) {
 3             K key;
 4             V value;
 5             synchronized (this) {
 6                 if (size < 0 || (map.isEmpty() && size != 0)) {
 7                     throw new IllegalStateException(getClass().getName()
 8                             + ".sizeOf() is reporting inconsistent results!");
 9                 }
10
11                 if (size <= maxSize) {
12                     break;
13                 }
14
15                 Map.Entry<K, V> toEvict = map.eldest();
16                 if (toEvict == null) {
17                     break;
18                 }
19
20                 key = toEvict.getKey();
21                 value = toEvict.getValue();
22                 map.remove(key);
23                 size -= safeSizeOf(key, value);
24                 evictionCount++;
25             }
26
27             entryRemoved(true, key, value, null);
28         }
29     }

android.util.LruCache,第20行代码

 1     private void trimToSize(int maxSize) {
 2         while (true) {
 3             K key;
 4             V value;
 5             synchronized (this) {
 6                 if (size < 0 || (map.isEmpty() && size != 0)) {
 7                     throw new IllegalStateException(getClass().getName()
 8                             + ".sizeOf() is reporting inconsistent results!");
 9                 }
10
11                 if (size <= maxSize) {
12                     break;
13                 }
14
15                 // BEGIN LAYOUTLIB CHANGE
16                 // get the last item in the linked list.
17                 // This is not efficient, the goal here is to minimize the changes
18                 // compared to the platform version.
19                 Map.Entry<K, V> toEvict = null;
20                 for (Map.Entry<K, V> entry : map.entrySet()) {
21                     toEvict = entry;
22                 }
23                 // END LAYOUTLIB CHANGE
24
25                 if (toEvict == null) {
26                     break;
27                 }
28
29                 key = toEvict.getKey();
30                 value = toEvict.getValue();
31                 map.remove(key);
32                 size -= safeSizeOf(key, value);
33                 evictionCount++;
34             }
35
36             entryRemoved(true, key, value, null);
37         }
38     }

所以最好使用Support包中的LruCache。

时间: 2024-08-07 18:24:33

Android api level-22中android.support.v4.util.LruCache和android.util.LruCache的行为不一样问题的相关文章

Android API Level最新版本到6.0Platform Codenames, Versions, API Levels, and NDK Releases

http://source.android.com/source/build-numbers.html#platform-code-names-versions-api-levels-and-ndk-releases Code name Version API level Marshmallow 6.0 API level 23 Lollipop 5.1 API level 22 Lollipop 5.0 API level 21 KitKat 4.4 - 4.4.4 API level 19

android.support.v4.app.Fragment vs android.app.Fragment 的区别

android.support.v4.app.Fragment vs android.app.Fragment 的区别 我开过平板相关应用,用了Fragment来处理.后来重新开发另外一个应用,直接引用了原来布局和代码, 我用的是android.support.v4.app.fragment居然死活通过.总是报错 “android.view.InflateException: Binary XML file line #7: Error inflating class fragment” 往下推

Android项目中导入support v4和v7

google提供了 Android Support Library package 系列的包来保证来高版本sdk开发的向下兼容性,即我们用4.x开发时,在1.6等版本上,可以使用高版本的有些特性,如 Fragement,ViewPager等,下面,简单说明下这几个版本间的区别: Android Support v4:  这个包是为了照顾1.6及更高版本而设计的,这个包是使用最广泛的,eclipse新建工程时,都默认带有了. Android Support v7:  这个包是为了考虑照顾2.1及以

[转]android.support.v4.app.Fragment和android.app.Fragment区别

1.最低支持版本不同 android.app.Fragment 兼容的最低版本是android:minSdkVersion="11" 即3.0版 android.support.v4.app.Fragment 兼容的最低版本是android:minSdkVersion="4" 即1.6版 2.需要导jar包 fragment android.support.v4.app.Fragment 需要引入包android-support-v4.jar 3.在Activity

android.support.v4.app.Fragment 和 android.app.Fragment区别

今天在公司遇到一个android.app.Fragment 和android.support.v4.app.Fragment 的问题. (1)android.app.Fragment:兼容的最低版本是android:minSdkVersion="11"因此你的应用不能兼容3.0以下的应用. 可以使用<fragment>标签的,这点很重要,如果是用android.support.v4.app.Fragment的话,是不能是用<fragment>标签的,会抛出and

Support v4 v7 v13: Android Support Library

Android Support v4:  这个包是为了照顾1.6及更高版本而设计的,这个包是使用最广泛的,eclipse新建工程时,都默认带有了. Android Support v7:  这个包是为了考虑照顾2.1及以上版本而设计的,但不包含更低,故如果不考虑1.6,我们可以采用再加上这个包,另外 注意,v7是要依赖v4这个包的,即,两个得同时被包含. Android Support v13:这个包的设计是为了android 3.2及更高版本的,一般我们都不常用,平板开发中能用到. Andro

android fragment(android.support.v4.app.Fragment和android.app.Fragment

(1)android.app.Fragment:兼容的最低版本是android:minSdkVersion="11" 因此你的应用不能兼容3.0以下的应用. 可以使用<fragment>标签的,这点很重要,如果是用android.support.v4.app.Fragment的话,是不能是用<fragment>标签的,会抛出android.view.InflateException: Binary XML file line #7: Error inflatin

Android API level 与version对应关系

https://www.cnblogs.com/jinglecode/p/7753107.html Platform Version API Level VERSION_CODE 中文名称 Android API 26 26 Android 7.1.1/7.1 25 Nougat Android 7.0 24 Nougat 牛轧糖 Android 6.0 23 Marshmallow 棉花糖 Android 5.1 22 Lollipop Android 5.0/L 21 Lollipop 棒棒

Android api level对照表

转自:blog.csdn.net/lihenair/article/details/49869299 Platform Version API Level VERSION_CODE Notes Android 8.1 27 O_MR1 平台亮点 Android 8.0 26 O 平台亮点 Android 7.1.1 7.1 25 N_MR1 平台亮点 Android 7.0 24 N 平台亮点 Android 6.0 23 M 平台亮点 Android 5.1 22 LOLLIPOP_MR1 平

在Android2.3.3即minSdkVersion 10上使用android.support.v4.widget.SwipeRefreshLayout和android.support.design

由于新的项目需要支持2.3.3版本的Android机型,额,2.3.3左右的已经份额非常非常小了, 还需要支持,真蛋疼. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" xmlns:app="http://schemas.android.com/apk/re