热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

AndroidImageCache图片缓存,使用简单,支持预取,支持多种缓存算法,支持不同网络类型,扩展性强...

主要介绍一个支持图片自动预取、支持多种缓存算法、支持二级缓存、支持数据保存和恢复的图片缓存的使用及功能。与AndroidLruCache相比主要特性:(1).使用简单

主要介绍一个支持图片自动预取、支持多种缓存算法、支持二级缓存、支持数据保存和恢复的图片缓存的使用及功能

 

与Android LruCache相比主要特性:(1). 使用简单  (2). 轻松获取及预取新图片  (3). 包含二级缓存  (4). 可选择多种缓存算法(FIFO、LIFO、LRU、MRU、LFU、MFU等13种)或自定义缓存算法  (5). 可方便的保存及初始化恢复数据  (6).  省流量性能佳(有且仅有一个线程获取图片)  (7). 支持不同类型网络处理  (8). 可根据系统配置初始化缓存  (9). 扩展性强  (10). 支持等待队列  (11). 包含map的大多数接口。

 

适用:获取图片较多的应用,如新浪微博、twitter、微信头像、美丽说、蘑菇街、花瓣、淘宝等等。

本文以用ImageCache实现瀑布流为例,示例APK地址见Demo.apk,示例代码地址见ImageCacheDemo,效果图如下:

1、使用

(1)引入公共库

引入TrineaAndroidCommon@Github(欢迎star和fork^_^)或TrineaAndroidCommon@GoogleCode作为你项目的library(如何拉取代码及添加公共库),或是自己抽取其中的ImageCache@Github或ImageCache@GoogleCode部分使用。

 

(2)调用

仅需简单两步:定义缓存和回调接口、调用get(String imageUrl, View view)异步加载图片。

需要加载图片的地方调用

上面代码中new ImageCache()用来定义图片缓存,默认会根据系统内存设置缓存大小。默认缓存算法为LFU(Least Frequently Used),最近最少使用先删除。 setOnImageCallbackListener(imageCallBack);设置图片获取成功回调接口。

onImageLoaded(String imageUrl, Drawable imageDrawable, View view, boolean isInCache)的四个参数分别表示图片url,获取到的Drawable,需要使用图片的view(get中传入的view),图片是否已经在缓存中。

 

可以在程序退出(比如onDestroy函数)时调用saveDataToDb(Context context, String tag)保存数据,在程序启动(比如onCreate函数)时调用initData(Context context, String tag)初始化恢复数据。其中tag为此ImageCache的标识。

 

get(imageUrl, imageView)异步获取图片,在图片获取成功后会自动调用onImageLoaded将参数传入。 get(String imageUrl,List urlList, View view)异步获取图片,并且会自动预取urlList中的图片。

 

上面是最简单的实现。 第2部分会介绍支持的其他功能,包括网络类型设置、预取个数设置、多种缓存算法、等待队列开关、图片源读取方式设置、缓存有效时间、命中率及大部分map接口。 第3部分介绍listView重叠问题解决、图片oom问题解决。

 

2、功能介绍 (1) 多种构造函数,可根据系统配置初始化缓存

public ImageCache() public ImageCache(int maxSize) public ImageCache(int maxSize, int threadPoolSize) 支持三种构造函数,支持缓存大小和获取图片线程池大小的设置。默认会根据系统可用内存大小设置缓存大小,根据系统Cpu个数设置线程池大小。

 

(2)、获取图片及自动预取 get(String imageUrl, View view)异步获取图片,在图片获取成功后自动调用OnImageCallbackListener的onImageLoaded函数,返回是否已在缓存中 get(String imageUrl, List urlList, View view)异步获取图片,在图片获取成功后自动调用OnImageCallbackListener的onImageLoaded函数,并且根据imageUrl在urlList中的位置向前向后预取图片,返回是否已在缓存中。

 

public void setForwardCacheNumber(int forwardCacheNumber) 向前预取图片个数设置,默认为PreloadDataCache#DEFAULT_FORWARD_CACHE_NUMBER

public void setBackwardCacheNumber(int backwardCacheNumber)向后预取图片个数设置默认,默认为PreloadDataCache#DEFAULT_BACKWARD_CACHE_NUMBER

 

public CacheObject get(K key) public CacheObject get(K key, List keyList) 两个接口是直接同步获取图片,且获取成功后不会调用OnImageCallbackListener的onImageLoaded函数

 

(3)、设置缓存算法 setCacheFullRemoveType(CacheFullRemoveType cacheFullRemoveType) 设置缓存算法,缓存算法即为缓存满时为了插入新数据,删除旧数据的规则。

 

目前包括FIFO、LIFO、LRU、MRU、LFU、MFU、优先级低先删除、优先级高先删除、数据小先删除、数据大先删除、图片小先删除、图片大先删除、永不删除。还可以通过实现CacheFullRemoveType来自定义缓存算法。。默认为RemoveTypeUsedCountSmall,即LRU使用频率低先删除。下面详细介绍各个算法:

RemoveTypeEnterTimeFirst FIFO先进先出,先进入先删除 RemoveTypeEnterTimeLast LIFO后进先出,后进入先删除 RemoveTypeLastUsedTimeFirst LRU(Least Recently User),最先使用先删除 RemoveTypeLastUsedTimeLast MRU(Most Recently Used),最近使用先删除 RemoveTypeUsedCountSmall LFU(Least Frequently Used),使用频率低先删除 RemoveTypeUsedCountBig MRU(Most Frequently Used),使用频率高先删除 RemoveTypePriorityLow 优先级低先删除 RemoveTypePriorityHigh 优先级低先删除 RemoveTypeDrawableSmall 图片小的先删除 RemoveTypeDrawableLarge 图片大的先删除

RemoveTypeDataBig 数据大先删除,根据缓存数据的compareTo函数决定 RemoveTypeDataSmall 数据小先删除,根据缓存数据的compareTo函数决定 RemoveTypeNotRemove 不删除,缓存满时不再允许插入新数据

 

自定义缓存算法只需要实现CacheFullRemoveType的compare方法即可。比较结果小于0表示会被先删除

 

(4)、是否启用队列 setOpenWaitingQueue(boolean isOpenWaitingQueue) 当不同view通过get函数获取图片时,是否开启等待队列。

若开启,保存所有view,图片获取成功后依次调用OnImageCallbackListener的onImageLoaded函数;否则仅保存最后调用get的view,图片获取成功后调用OnImageCallbackListener的onImageLoaded函数 默认开启队列等待。如果希望最优性能且场景满足,可设置为false。

 

(5)、设置图片获取方式接口 setOnGetDataListener(OnGetDataListener onGetDataListener) 设置图片获取的方式。缓存通过该接口获取图片及预取图片。默认为ImageCache中getDefaultOnGetImageListener,通过url获取图片。你可以重写该方法将图片缓存改为本地图片文件缓存等等。

 

(6)、优化图片读取 a. 设置图片读取http超时 public void setHttpReadTimeOut(int readTimeOutMillis) 若readTimeOutMillis小于0表示不设置超时,默认不设置,单位为毫秒

b. 设置无网络不读取 public void setContext(Context context) 设置context,网络连接失败不会新建线程请求图片。

c. 支持不同网络类型的处理 public void setAllowedNetworkTypes(int allowedNetworkTypes) 设置允许的网络类型,可选择PreloadDataCache#NETWORK_MOBILE、PreloadDataCache#NETWORK_WIFI或两者都允许。默认两者都允许。 注意:这个接口生效必须先setContext(Context context)

 

(7)、缓存元素有效时间 setValidTime(long validTime) 设置缓存元素有效时间,小于0表示不会失效,此时仅根据CacheFullRemoveType在缓存满时替换元素 通过protected boolean isExpired(K key)判断某key是否过期

 

(8)、缓存命中率 getHitRate()、getHitCount()、getMissCount()分别表示缓存命中率、命中次数、未命中次数

 

(9)、线程池shutdown

public void shutdown()程序结束有需要可以调用shutdown关闭线程池。

 

(10)、其他与map类似接口 public boolean containsKey(K key) 缓存中是否包含该key public CacheObject remove(K key) 从缓存中删除某个key public void clear() 清空缓存 public Set keySet() 缓存中key集合 public Set>> entrySet() 缓存中key,value键值对集合 public Collection> values() 缓存中元素集合 public CacheObject put(K key, V value) 手动插入某个元素 public CacheObject put(K key, CacheObject value) 手动插入某个元素 public CacheObject get(K key) 得到某个key public int getSize() 得到缓存中有效元素个数 public int getMaxSize() 得到缓存中元素最大个数

 

(11)得到设置 上面的set几乎都可以通过对应的get得到相应value 使用getOnGetDataListener()得到获取图片的方法 getForwardCacheNumber()得到自动向前缓存的个数 getBackCacheNumber()得到自动向后缓存的个数 getMaxSize()得到缓存最大容量 getValidTime()得到有效时间,以毫秒计 getCacheFullRemoveType()得到cache满时删除元素类型

转:https://www.cnblogs.com/rosepotato/p/3441279.html



推荐阅读
  • 近来有一个需求,是需要在androidjava基础库中插入一些log信息,完成这个工作需要的前置条件有编译好的android源码具体android源码如何编译,这 ... [详细]
  • 本文介绍了在Android开发中使用软引用和弱引用的应用。如果一个对象只具有软引用,那么只有在内存不够的情况下才会被回收,可以用来实现内存敏感的高速缓存;而如果一个对象只具有弱引用,不管内存是否足够,都会被垃圾回收器回收。软引用和弱引用还可以与引用队列联合使用,当被引用的对象被回收时,会将引用加入到关联的引用队列中。软引用和弱引用的根本区别在于生命周期的长短,弱引用的对象可能随时被回收,而软引用的对象只有在内存不够时才会被回收。 ... [详细]
  • 今天就跟大家聊聊有关怎么在Android应用中实现一个换肤功能,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • Google Play推出全新的应用内评价API,帮助开发者获取更多优质用户反馈。用户每天在Google Play上发表数百万条评论,这有助于开发者了解用户喜好和改进需求。开发者可以选择在适当的时间请求用户撰写评论,以获得全面而有用的反馈。全新应用内评价功能让用户无需返回应用详情页面即可发表评论,提升用户体验。 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • Java中包装类的设计原因以及操作方法
    本文主要介绍了Java中设计包装类的原因以及操作方法。在Java中,除了对象类型,还有八大基本类型,为了将基本类型转换成对象,Java引入了包装类。文章通过介绍包装类的定义和实现,解答了为什么需要包装类的问题,并提供了简单易用的操作方法。通过本文的学习,读者可以更好地理解和应用Java中的包装类。 ... [详细]
  • 本文介绍了Android中的assets目录和raw目录的共同点和区别,包括获取资源的方法、目录结构的限制以及列出资源的能力。同时,还解释了raw目录中资源文件生成的ID,并说明了这些目录的使用方法。 ... [详细]
  • struts2重点——ValueStack和OGNL
    一、值栈(ValueStack)1.实现类:OGNLValueStack2.对象栈:CompoundRoot( ... [详细]
  • android ... [详细]
author-avatar
castellaniygw_623
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有