iis服务器助手广告广告
返回顶部
首页 > 资讯 > 移动开发 >android实现缓存图片等数据
  • 781
分享到

android实现缓存图片等数据

数据图片缓存Android 2022-06-06 09:06:03 781人浏览 安东尼
摘要

采用LinkedHashMap自带的LRU 算法缓存数据, 可检测对象是否已被虚拟机回收,并且重新计算当前缓存大小,清除缓存中无用的键值对象(即已经被虚拟机回收但未从缓存清除的

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


package cc.util.cache;
import java.io.Serializable;
import java.util.Objects;

public class NetByteWrapper implements Serializable {
  private final static long serialVersionUID = 1L;
  
  private byte[] data;
  
  int contentLength;
  
  private long lastModified;
  
  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;

public class NetByteSoftReference extends SoftReference<NetByteWrapper> {
  private String key = "";
  private long length = 0;
  public NetByteSoftReference(String key, NetByteWrapper arg0) {
    this(key, arg0, null);
  }
  public NetByteSoftReference(String key, NetByteWrapper arg0,
      ReferenceQueue<? 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;

public class NetCacheManager {
  
  private long MAX_CACHE_SIZE = 4 * 1024 * 1024;
  private long cacheSize = 0; 
  private static NetCacheManager instance = null;
  private final ReferenceQueue<NetByteWrapper> referenceQueue;
  private final LinkedHashMap<String, NetByteSoftReference> cacheMap;
  private NetCacheManager(){
    referenceQueue = new ReferenceQueue<NetByteWrapper>();
    cacheMap = new LinkedHashMap<String, NetByteSoftReference>(16, 0.75f, true) {
      private static final long serialVersionUID = -8378285623387632829L;
      @Override
      protected boolean removeEldestEntry(
          java.util.Map.Entry<String, NetByteSoftReference> eldest) {
        // TODO Auto-generated method stub
        boolean shouldRemove = cacheSize > MAX_CACHE_SIZE;
        if (shouldRemove) {
          cacheSize -= eldest.getValue().getLength();
          System.GC();
        }
        return shouldRemove;
      }
    };
  }
  
  public static synchronized NetCacheManager newInstance(){
    if (Objects.isNull(instance)) {
      instance = new NetCacheManager();
    }
    return instance;
  }
  
  public void setMaxCacheSize(long cacheSize) {
    this.MAX_CACHE_SIZE = cacheSize;
  }
  
  public long getCacheSize() {
    return cacheSize;
  }
  
  public void cacheInMemory(String key, byte[] value) {
    this.cacheInMemory(key, value, 0, null);
  }
  
  public void cacheInMemory(String key, byte[] value, long lastModified) {
    this.cacheInMemory(key, value, lastModified, null);
  }
  
  public void cacheInMemory(String key, byte[] value, String Etags) {
    this.cacheInMemory(key, value, 0, 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;
  }
  
  public void cacheInDisk(String key, byte[] value, String path) {
    cacheInDisk(key, value, path, false);
  }
  
  public void cacheInDisk(String key, byte[] value, String path, boolean cacheInMemory) {
    this.cacheInDisk(key, value, 0, null, path, 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();
    }
  }
  
  public NetByteWrapper getFromMemory(String key) {
    SoftReference<NetByteWrapper> softReference = cacheMap.get(key);
    return Objects.nonNull(softReference) ? softReference.get() : null;
  }
  
  public byte[] getByteFromMemory(String key) {
    NetByteWrapper wrapper = getFromMemory(key);
    return Objects.nonNull(wrapper) ? wrapper.getData() : null;
  }
  
  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;
    }
  }
  
  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 < len; offset += 1024) { 
        if (len - 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;
    }
  }
  
  public byte[] getByteFromDisk(String path) {
    NetByteWrapper wrapper = getFromDisk(path);
    return Objects.isNull(wrapper) ? null : wrapper.getData();
  }
  
  public byte[] getByteFromDiskByMapped(String path) {
    NetByteWrapper wrapper = getFromDiskByMapped(path);
    return Objects.isNull(wrapper) ? null : wrapper.getData();
  }
  
  private void clearRecycledObject() {
    NetByteSoftReference ref = null;
    //检测对象是否被回收,如果被回收则从缓存中移除死项
    while (Objects.nonNull((ref = (NetByteSoftReference) referenceQueue.poll()))) {
      cacheMap.remove(ref.getKey());
    }
    cacheSize = 0;
    Iterator<String> keys = cacheMap.keySet().iterator();
    while (keys.hasNext()) {
      cacheSize += cacheMap.get(keys.next()).getLength();
    }
  }
  
  public void clearCache() {
    clearRecycledObject();
    cacheMap.clear();
    System.gc();
    System.runFinalization();
  }
}

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

您可能感兴趣的文章:Android图片缓存之Lru算法(二)Android图片缓存之Bitmap详解(一)Android中Glide加载库的图片缓存配置究极指南android中图片的三级缓存cache策略(内存/文件/网络)android异步加载图片并缓存到本地实现方法Android中使用二级缓存、异步加载批量加载图片完整案例android上的一个网络接口和图片缓存框架enif简析Android开发笔记之图片缓存、手势及OOM分析Android使用缓存机制实现文件下载及异步请求图片加三级缓存Android图片缓存之初识Glide(三)


--结束END--

本文标题: android实现缓存图片等数据

本文链接: http://www.lsjlt.com/news/26620.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Android中怎么实现图片缓存机制
    这期内容当中小编将会给大家带来有关Android中怎么实现图片缓存机制,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。Android 图片缓存机制的深入理解Android加载一张图片到用户界面是很简单的,但...
    99+
    2023-05-30
    android
  • Android二级缓存加载图片实现照片墙功能
    实现二级缓存加载图片的功能,在使用DiskLruCache时,需先在工程中添加名为libcore.io的包,并将DiskLruCache.Java文件放进去。DiskLruCache直接百度下载即可。在GridView的适配器中,为Imag...
    99+
    2023-05-31
    android 加载图片 照片墙
  • Android图片三级缓存的原理及其实现
    为什么要使用三级缓存 如今的 Android App 经常会需要网络交互,通过网络获取图片是再正常不过的事了 假如每次启动的时候都从网络拉取图片的话,势必会消耗很多流量。在当前的状况下,对于非wifi用户来说,流量还是很贵的,一个很耗流...
    99+
    2023-05-30
    android 图片 三级缓存
  • Android实现缓存大图到SD卡
    本文实例为大家分享了Android实现缓存大图到SD卡的具体代码,供大家参考,具体内容如下 该功能主要针对资源图片过大占用apk体积,所以先将图片事先下载,在通过Glide加载时先去...
    99+
    2024-04-02
  • Android中Glide获取缓存大小并清除缓存图片
    清除Glide缓存 Glide自带清除缓存的功能,分别对应Glide.get(context).clearDiskCache();(清除磁盘缓存)与Glide.get(context).clearMemory();(清除内存缓存)两个方法....
    99+
    2023-05-31
    android glide 缓存
  • Android 图片的三级缓存机制实例分析
    Android 图片的三级缓存机制实例分析当我们获取图片的时候,如果不加以协调好图片的缓存,就会造成大流量,费流量应用,用户体验不好,影响后期发展。为此,我特地分享Android图片的三级缓存机制之从网络中获取图片,来优化应用,具体分三步进...
    99+
    2023-05-31
    android 图片 三级缓存
  • 详解Android中图片的三级缓存及实例
    详解Android中图片的三级缓存及实例为什么要使用三级缓存 如今的 Android App 经常会需要网络交互,通过网络获取图片是再正常不过的事了 假如每次启动的时候都从网络拉取图片的话,势必会消耗很多流量。在当前的状况下,对于非wi...
    99+
    2023-05-30
    android 三级缓存 roi
  • Android 数据库中怎么存取图片
    Android 数据库中怎么存取图片,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。一、数据库创建和存取方法:在数据库创建时,图片字段的数据...
    99+
    2024-04-02
  • 如何理解Android图片缓存框架Glide
    本篇文章给大家分享的是有关如何理解Android图片缓存框架Glide,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。Android图片缓存框架GlideGlide是Google...
    99+
    2023-06-05
  • redis怎么实现图片流式播放缓存
    要实现图片流式播放缓存,可以使用Redis的List数据结构和Bitmap操作。首先,将图片URL按照顺序加入到Redis的List...
    99+
    2023-09-04
    redis
  • 浅谈Android 中图片的三级缓存策略
    什么是三级缓存? 内存缓存,优先加载,速度最快 本地缓存,次优先加载,速度快 网络缓存,最后加载,速度慢,浪费流量为什么要进行三级缓存三级缓存策略,最实在的意义就是 减少不必要的流量消耗,增加加载速度 。如今的 APP 网络交互似乎已...
    99+
    2023-05-30
    android 图片 三级缓存
  • Android实现图片预览与保存功能
    目录前言引入插件总结前言 在App开发中,通常为了省流提高加载速度提升用户体验我们通常在列表中或新闻中的插图都是以缩略图压缩过的图片来进行展示,当用户点击图片时我们再去加载真正像素的...
    99+
    2024-04-02
  • 如何使用PHP缓存函数实现实时数据缓存?
    PHP缓存函数是一种将数据存储在内存或磁盘上的技术。该技术可以大大提高应用程序的性能和响应速度,尤其在需要频繁查询数据库的情况下。本文将介绍如何使用PHP缓存函数实现实时数据缓存。 一、什么是缓存? 缓存是将数据存储在内存或磁盘上,以便快速...
    99+
    2023-08-11
    缓存 函数 实时
  • HTML5离线缓存在tomcat下如何部署可实现图片flash等离线浏览
    这篇文章给大家介绍HTML5离线缓存在tomcat下如何部署可实现图片flash等离线浏览,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。 打开一个网页,加...
    99+
    2024-04-02
  • 详解Flutter网络图片本地缓存的实现
    目录一、问题二、思路三、实现四、使用五、缓存清理一、问题 Flutter原有的图片缓存机制,是通过PaintingBinding.instance!.imageCache来管理缓存的...
    99+
    2023-05-16
    Flutter网络图片本地缓存 Flutter 图片缓存
  • PHP怎么实现数据缓存类
    这篇文章主要介绍了PHP怎么实现数据缓存类,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。思路是这样的:对于一般的变量,把该变量变成PHP语言的格式,写到文件中,用时只要inc...
    99+
    2023-06-17
  • ASP.NET和SQL Server数据库图片存储如何实现
    这篇文章主要为大家展示了“ASP.NET和SQL Server数据库图片存储如何实现”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“ASP.NET和SQL Server数据库图片存储如何实现”这篇...
    99+
    2023-06-18
  • Couchbase中怎么实现数据缓存
    在Couchbase中,数据缓存可以通过使用Couchbase的内置缓存功能来实现。Couchbase是一个基于内存的NoSQL数据...
    99+
    2024-03-08
    Couchbase
  • Android实现图片九宫格
    本文实例为大家分享了Android实现图片九宫格的具体代码,供大家参考,具体内容如下 九宫格分三类 实现的效果 具体实现 activity_main <xml v...
    99+
    2024-04-02
  • Android怎么实现图片预览与保存功能
    这篇“Android怎么实现图片预览与保存功能”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Android怎么实现图片预览与...
    99+
    2023-06-30
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作