热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

android实现缓存图片等数据

本文给大家分享的是Android采用LinkedHashMap自带的LRU算法缓存数据的方法和示例,有需要的小伙伴可以参考下。

采用LinkedHashMap自带的LRU 算法缓存数据, 可检测对象是否已被虚拟机回收,并且重新计算当前缓存大小,清除缓存中无用的键值对象(即已经被虚拟机回收但未从缓存清除的数据);
 * 默认内存缓存大小为: 4 * 1024 * 1024 可通过通过setMaxCacheSize重新设置缓存大小,可手动清空内存缓存
 *
支持内存缓存和磁盘缓存方式, 通过 {@link cc.util.cache.NetByteWrapper} 支持HTTP缓存 (注:详细参考cc.util.http包); 注:使用JDK7

package cc.util.cache;
 
import java.io.Serializable;
import java.util.Objects;
 
/**
  封装网络数据, 将数据的Etag、lastModified获取到, 下次请求的时候提取出来到服务器比对
 * Help to wrap byte data which obtains from network, It will work with {@link cc.util.cache.NetChacheManager} 
 * @author wangcccong
 * @version 1.1406
 * 
create at: Tues, 10 Jun 2014 */ public class NetByteWrapper implements Serializable { private final static long serialVersiOnUID= 1L; /** data from network */ private byte[] data; /** data size */ int contentLength; /** latested modify time */ private long lastModified; /** ETag: look up HTTP Protocol */ private String ETag; public NetByteWrapper(byte[] data, long lastModified, String Etag) { this.data = data; this.lastModified = lastModified; this.ETag = Etag; } public byte[] getData() { return data; } public void setData(byte[] data) { this.data = data; } public long getLastModified() { return lastModified; } public void setLastModified(long lastModified) { this.lastModified = lastModified; } public String getETag() { return ETag; } public void setETag(String eTag) { this.ETag = eTag; } public int getContentLength() { return Objects.isNull(data) ? 0 : data.length; } } package cc.util.cache; import java.lang.ref.ReferenceQueue; import java.lang.ref.SoftReference; /**采用软引用方式将数据存放起来 * enclose {@link cc.util.cache.NetByteWrapper} with {@link java.lang.ref.SoftReference}, In order to recycle the memory * @author wangcccong * @version 1.1406 *
create at: Tues, 10 Jun. 2014 */ public class NetByteSoftReference extends SoftReference { private String key = ""; private long length = 0; public NetByteSoftReference(String key, NetByteWrapper arg0) { this(key, arg0, null); } public NetByteSoftReference(String key, NetByteWrapper arg0, ReferenceQueue<&#63; super NetByteWrapper> arg1) { super(arg0, arg1); // TODO Auto-generated constructor stub this.key = key; this.length = arg0.getContentLength(); } public String getKey() { return key; } public long getLength() { return length; } } package cc.util.cache; import java.lang.ref.ReferenceQueue; import java.lang.ref.SoftReference; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.Objects; /** * 采用LinkedHashMap自带的LRU 算法缓存数据, 可检测对象是否已被虚拟机回收,并且重新计算当前缓存大小,清除缓存中无用的键值对象(即已经被虚拟机回收但未从缓存清除的数据); * 默认内存缓存大小为: 4 * 1024 * 1024 可通过通过setMaxCacheSize重新设置缓存大小,可手动清空内存缓存,支持采用内存映射方式读取缓存 *
支持内存缓存和磁盘缓存方式, 通过 {@link cc.util.cache.NetByteWrapper} 支持HTTP缓存 (注:详细参考cc.util.http包) * @author wangcccong * @version 1.1406 *
create at: Tues, 10 Jun 2014 */ public class NetCacheManager { /** max cache size */ private long MAX_CACHE_SIZE = 4 * 1024 * 1024; private long cacheSize = 0; private static NetCacheManager instance = null; private final ReferenceQueue referenceQueue; private final LinkedHashMap cacheMap; private NetCacheManager(){ referenceQueue = new ReferenceQueue(); cacheMap = new LinkedHashMap(16, 0.75f, true) { private static final long serialVersiOnUID= -8378285623387632829L; @Override protected boolean removeEldestEntry( java.util.Map.Entry eldest) { // TODO Auto-generated method stub boolean shouldRemove = cacheSize > MAX_CACHE_SIZE; if (shouldRemove) { cacheSize -= eldest.getValue().getLength(); System.gc(); } return shouldRemove; } }; } /** singleton model */ public static synchronized NetCacheManager newInstance(){ if (Objects.isNull(instance)) { instance = new NetCacheManager(); } return instance; } /** * reset the memory cache size * @param cacheSize */ public void setMaxCacheSize(long cacheSize) { this.MAX_CACHE_SIZE = cacheSize; } /** * 获取当前内存缓存大小 * @return */ public long getCacheSize() { return cacheSize; } /** * 将数据缓存至内存, 如果http返回的数据不支持缓存则采用此方法,缓存的key一般为请求的url * @param key * @param value */ public void cacheInMemory(String key, byte[] value) { this.cacheInMemory(key, value, 0, null); } /** * 将数据缓存至内存, 如果http返回的数据支持缓存则采用此方法 * @param key * @param value * @param lastModified */ public void cacheInMemory(String key, byte[] value, long lastModified) { this.cacheInMemory(key, value, lastModified, null); } /** * 将数据缓存至内存, 如果http返回的数据支持缓存则采用此方法 * @param key * @param value * @param Etags */ public void cacheInMemory(String key, byte[] value, String Etags) { this.cacheInMemory(key, value, 0, Etags); } /** * 将数据缓存至内存, 如果http返回的数据支持缓存则采用此方法 * @param key * @param value * @param lastModified * @param Etags */ private void cacheInMemory(String key, byte[] value, long lastModified, String Etags) { Objects.requireNonNull(key, "key must not be null"); clearRecycledObject(); NetByteWrapper wrapper = new NetByteWrapper(value, lastModified, Etags); NetByteSoftReference byteRef = new NetByteSoftReference(key, wrapper, referenceQueue); cacheMap.put(key, byteRef); value = null; wrapper = null; } /** * 缓存至磁盘, 默认不首先缓存到内存 * @param key * @param value * @param path */ public void cacheInDisk(String key, byte[] value, String path) { cacheInDisk(key, value, path, false); } /** * * @param key * @param value * @param path * @param cacheInMemory */ public void cacheInDisk(String key, byte[] value, String path, boolean cacheInMemory) { this.cacheInDisk(key, value, 0, null, path, cacheInMemory); } /** * * @param key * @param value * @param lastModified * @param Etags * @param path * @param cacheInMemory */ private void cacheInDisk(String key, byte[] value, long lastModified, String Etags, String path, boolean cacheInMemory) { if (cacheInMemory) cacheInMemory(key, value, lastModified, Etags); try (FileOutputStream fos = new FileOutputStream(path); ObjectOutputStream oos = new ObjectOutputStream(fos)) { NetByteWrapper wrapper = new NetByteWrapper(value, lastModified, Etags); oos.writeObject(wrapper); } catch (Exception e) { // TODO: handle exception e.printStackTrace(); } } /** * get {@link cc.util.cache.NetByteWrapper} from memory according to key * @param key * @return {@link cc.util.cache.NetByteWrapper} */ public NetByteWrapper getFromMemory(String key) { SoftReference softReference = cacheMap.get(key); return Objects.nonNull(softReference) &#63; softReference.get() : null; } /** * get byte[] from memory according to key * @param context * @param key * @return */ public byte[] getByteFromMemory(String key) { NetByteWrapper wrapper = getFromMemory(key); return Objects.nonNull(wrapper) &#63; wrapper.getData() : null; } /** * 从磁盘获取数据 * @param path * @return {@link cc.util.cache.NetByteWrapper} */ public NetByteWrapper getFromDisk(String path) { try (FileInputStream fis = new FileInputStream(path); ObjectInputStream ois = new ObjectInputStream(fis)) { NetByteWrapper wrapper = (NetByteWrapper) ois.readObject(); return wrapper; } catch (Exception e) { // TODO: handle exception e.printStackTrace(); return null; } } /** * 采用内存映射的方式从磁盘获取数据(加快读取缓存的大文件) * @param path * @return */ public NetByteWrapper getFromDiskByMapped(String path) { try (FileInputStream fis = new FileInputStream(path); FileChannel channel= fis.getChannel(); ByteArrayOutputStream baos = new ByteArrayOutputStream()){ MappedByteBuffer mbb = channel.map(FileChannel.MapMode.READ_ONLY, 0, channel.size()); byte[] bts = new byte[1024]; int len = (int) channel.size(); for (int offset = 0; offset 1024) mbb.get(bts); else mbb.get((bts = new byte[len - offset])); baos.write(bts); } ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray()); ObjectInputStream ois = new ObjectInputStream(bais); NetByteWrapper wrapper = (NetByteWrapper) ois.readObject(); bais.close(); ois.close(); return wrapper; } catch (Exception e) { // TODO: handle exception e.printStackTrace(); return null; } } /** * 从磁盘获取缓存的byte[] 数据 * @param path * @return */ public byte[] getByteFromDisk(String path) { NetByteWrapper wrapper = getFromDisk(path); return Objects.isNull(wrapper) &#63; null : wrapper.getData(); } /** * 通过内存映射放射从磁盘获取缓存的byte[] 数据 * @param path * @return */ public byte[] getByteFromDiskByMapped(String path) { NetByteWrapper wrapper = getFromDiskByMapped(path); return Objects.isNull(wrapper) &#63; null : wrapper.getData(); } /** * calculate the size of the cache memory */ private void clearRecycledObject() { NetByteSoftReference ref = null; //检测对象是否被回收,如果被回收则从缓存中移除死项 while (Objects.nonNull((ref = (NetByteSoftReference) referenceQueue.poll()))) { cacheMap.remove(ref.getKey()); } cacheSize = 0; Iterator keys = cacheMap.keySet().iterator(); while (keys.hasNext()) { cacheSize += cacheMap.get(keys.next()).getLength(); } } /** * clear the memory cache */ public void clearCache() { clearRecycledObject(); cacheMap.clear(); System.gc(); System.runFinalization(); } }

以上所述就是本文的全部内容了,希望大家能够喜欢。


推荐阅读
  • Linux服务器密码过期策略、登录次数限制、私钥登录等配置方法
    本文介绍了在Linux服务器上进行密码过期策略、登录次数限制、私钥登录等配置的方法。通过修改配置文件中的参数,可以设置密码的有效期、最小间隔时间、最小长度,并在密码过期前进行提示。同时还介绍了如何进行公钥登录和修改默认账户用户名的操作。详细步骤和注意事项可参考本文内容。 ... [详细]
  • 本文介绍了Paxos的世界中关于复制日志与状态机的概念和重要性。通过存储日志来实现数据的持久化,并通过日志流来记录数据的变化,而不是直接持久化数据本身。这样做的好处是简化了持久化存储的操作,并且方便多机之间的数据同步。 ... [详细]
  • 本文介绍了解决Netty拆包粘包问题的一种方法——使用特殊结束符。在通讯过程中,客户端和服务器协商定义一个特殊的分隔符号,只要没有发送分隔符号,就代表一条数据没有结束。文章还提供了服务端的示例代码。 ... [详细]
  • 本文介绍了在rhel5.5操作系统下搭建网关+LAMP+postfix+dhcp的步骤和配置方法。通过配置dhcp自动分配ip、实现外网访问公司网站、内网收发邮件、内网上网以及SNAT转换等功能。详细介绍了安装dhcp和配置相关文件的步骤,并提供了相关的命令和配置示例。 ... [详细]
  • 搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的详细步骤
    本文详细介绍了搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的步骤,包括环境说明、相关软件下载的地址以及所需的插件下载地址。 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • 本文介绍了使用AJAX的POST请求实现数据修改功能的方法。通过ajax-post技术,可以实现在输入某个id后,通过ajax技术调用post.jsp修改具有该id记录的姓名的值。文章还提到了AJAX的概念和作用,以及使用async参数和open()方法的注意事项。同时强调了不推荐使用async=false的情况,并解释了JavaScript等待服务器响应的机制。 ... [详细]
  • PHP设置MySQL字符集的方法及使用mysqli_set_charset函数
    本文介绍了PHP设置MySQL字符集的方法,详细介绍了使用mysqli_set_charset函数来规定与数据库服务器进行数据传送时要使用的字符集。通过示例代码演示了如何设置默认客户端字符集。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • Centos7.6安装Gitlab教程及注意事项
    本文介绍了在Centos7.6系统下安装Gitlab的详细教程,并提供了一些注意事项。教程包括查看系统版本、安装必要的软件包、配置防火墙等步骤。同时,还强调了使用阿里云服务器时的特殊配置需求,以及建议至少4GB的可用RAM来运行GitLab。 ... [详细]
  • 本文介绍了在Hibernate配置lazy=false时无法加载数据的问题,通过采用OpenSessionInView模式和修改数据库服务器版本解决了该问题。详细描述了问题的出现和解决过程,包括运行环境和数据库的配置信息。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • 本文介绍了如何找到并终止在8080端口上运行的进程的方法,通过使用终端命令lsof -i :8080可以获取在该端口上运行的所有进程的输出,并使用kill命令终止指定进程的运行。 ... [详细]
  • 禁止程序接收鼠标事件的工具_VNC Viewer for Mac(远程桌面工具)免费版
    VNCViewerforMac是一款运行在Mac平台上的远程桌面工具,vncviewermac版可以帮助您使用Mac的键盘和鼠标来控制远程计算机,操作简 ... [详细]
  • 本文详细介绍了云服务器API接口的概念和作用,以及如何使用API接口管理云上资源和开发应用程序。通过创建实例API、调整实例配置API、关闭实例API和退还实例API等功能,可以实现云服务器的创建、配置修改和销毁等操作。对于想要学习云服务器API接口的人来说,本文提供了详细的入门指南和使用方法。如果想进一步了解相关知识或阅读更多相关文章,请关注编程笔记行业资讯频道。 ... [详细]
author-avatar
亲个小亲爱剖
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有