iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Android 图片的三级缓存机制实例分析
  • 332
分享到

Android 图片的三级缓存机制实例分析

android图片三级缓存 2023-05-31 04:05:25 332人浏览 薄情痞子
摘要

Android 图片的三级缓存机制实例分析当我们获取图片的时候,如果不加以协调好图片的缓存,就会造成大流量,费流量应用,用户体验不好,影响后期发展。为此,我特地分享Android图片的三级缓存机制之从网络中获取图片,来优化应用,具体分三步进

Android 图片的三级缓存机制实例分析

当我们获取图片的时候,如果不加以协调好图片的缓存,就会造成大流量,费流量应用,用户体验不好,影响后期发展。为此,我特地分享Android图片的三级缓存机制之从网络中获取图片,来优化应用,具体分三步进行:

(1)从缓存中获取图片
(2)从本地的缓存目录中获取图片,并且获取到之后,放到缓存中
(3)从网络去下载图片,下载完成之后,保存到本地和放到缓存中

很好的协调这三层图片缓存就可以大幅度提升应用的性能和用户体验。

快速实现三级缓存的工具类ImageCacheUtil如下(有更好的建议可以发我的邮箱说出你的想法,一起完善,邮箱见博客主页“给我写信”):

1.从网络中获取图片的三级缓存工具类ImageCacheUtil

public class ImageCacheUtil {  private LruCache<String, Bitmap> lruCache;  private File cacheDir;  private ExecutorService newFixedThreadPool;  private Handler handler;  public static final int SUCCESS = 100;  public static final int FaiL = 101;  //当我们获取图片的时候,分三步  //1.从缓存中获取图片  //2.从本地的缓存目录中获取图片,并且获取到之后,放到缓存中  //3.从网络去下载图片,下载完成之后,保存到本地缓存目录和放到缓存中  public ImageCacheUtil(Context context,Handler handler){    //获取缓存的大小    int maxsize = (int) (Runtime.getRuntime().maxMemory()/8);    //maxSize : 设置缓存的最大空间    lruCache = new LruCache<String, Bitmap>(maxsize){      //获取移出的图片所占用的空间,当图片移出的时候,需要将图片占用的缓存空间从缓存中移出       @Override      protected int sizeOf(String key, Bitmap value) {         //计算图片所占用的缓存大小         //getRowBytes : 获取图片一行所占用的大小         //getHeight : 获取图片所占用行数        return value.getRowBytes()*value.getHeight();      }    };    //获取缓存目录    cacheDir = context.getCacheDir();    //获取线程池    //nThreads : 线程池中的线程数量    newFixedThreadPool = Executors.newFixedThreadPool(5);    this.handler = handler;  }    public Bitmap getBitmap(String url,int position){    Bitmap bitmap = null;    //1.从缓存中获取图片 (LRUCache<k,v>) k:key 保存图片的标示,一般都是图片的url地址,v:value 图片    bitmap = lruCache.get(url);//根据key从缓存中获取相应的图片    //lruCache.put(url, bitmap):保存图片到缓存中    if (bitmap!=null) {      return bitmap;    }    //2.从本地的缓存目录中获取图片,并且获取到之后,放到缓存中    bitmap = getFromLocal(url);    if (bitmap!=null) {      return bitmap;    }    //3.从网络去下载图片,下载完成之后,保存到本地缓存目录和放到缓存中    getFromNet(url,position);    return null;  }    private void getFromNet(String url, int position) {    newFixedThreadPool.execute(new RunnableTask(url,position));  }  class RunnableTask implements Runnable{    private String imageUrl;    private int position;    public RunnableTask(String url,int position){      this.imageUrl = url;      this.position = position;    }    @Override    public void run() {      Message message = Message.obtain();      //下载图片      try {        URL url = new URL(imageUrl);        HttpURLConnection conn = (HttpURLConnection) url.openConnection();        conn.setReadTimeout(3000);        conn.setConnectTimeout(5000);        conn.setRequestMethod("GET");        InputStream inputStream = conn.getInputStream();        Bitmap bitmap = BitmapFactory.decodeStream(inputStream);        //保存到本地缓存中        wirteToLocal(imageUrl, bitmap);        //保存到系统缓冲中        lruCache.put(imageUrl, bitmap);        //显示图片,给handler发送消息        message.what = SUCCESS;        message.obj = bitmap;        message.arg1 = position;        handler.sendMessage(message);        return;      } catch (Exception e) {        e.printStackTrace();      }      message.what = FAIL;      handler.sendMessage(message);    }  }    private Bitmap getFromLocal(String url) {    //根据图片的名称获取图片    try {      String fileName = MD5Encoder.encode(url).substring(10);      File file = new File(cacheDir, fileName);      Bitmap bitmap = BitmapFactory.decodeFile(file.getAbsolutePath());      //防盗缓存当中      lruCache.put(url, bitmap);      return bitmap;    } catch (Exception e) {      e.printStackTrace();    }    return null;  }    public void wirteToLocal(String url,Bitmap bitmap){    //url名称,通过MD5加密,并且截取前10位作为名称    try {      String fileName = MD5Encoder.encode(url).substring(10);      File file = new File(cacheDir, fileName);      FileOutputStream out = new FileOutputStream(file);      //fORMat :图片的格式(android中用的png多,因为png质量是不会改变的)      //quality : 压缩比例      //stream : 流信息      bitmap.compress(CompressFormat.JPEG, 100, out);//将图片保存到那个位置    } catch (Exception e) {      e.printStackTrace();    }  }}

--结束END--

本文标题: Android 图片的三级缓存机制实例分析

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

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

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

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

下载Word文档
猜你喜欢
  • Android 图片的三级缓存机制实例分析
    Android 图片的三级缓存机制实例分析当我们获取图片的时候,如果不加以协调好图片的缓存,就会造成大流量,费流量应用,用户体验不好,影响后期发展。为此,我特地分享Android图片的三级缓存机制之从网络中获取图片,来优化应用,具体分三步进...
    99+
    2023-05-31
    android 图片 三级缓存
  • Android中图片的三级缓存机制
    我们不能每次加载图片的时候都让用户从网络上下载,这样不仅浪费流量又会影响用户体验,所以Android中引入了图片的缓存这一操作机制。 原理:   首先根据图片的网络地址在网络上...
    99+
    2022-06-06
    三级缓存 图片 缓存 Android
  • 详解Android中图片的三级缓存及实例
    详解Android中图片的三级缓存及实例为什么要使用三级缓存 如今的 Android App 经常会需要网络交互,通过网络获取图片是再正常不过的事了 假如每次启动的时候都从网络拉取图片的话,势必会消耗很多流量。在当前的状况下,对于非wi...
    99+
    2023-05-30
    android 三级缓存 roi
  • 详解Android 图片的三级缓存及图片压缩
    为什么需要图片缓存 Android默认给每个应用只分配16M的内存,所以如果加载过多的图片,为了防止内存溢出,应该将图片缓存起来。图片的三级缓存分别是: 内存缓存 本地...
    99+
    2022-06-06
    压缩 三级缓存 图片 图片压缩 缓存 Android
  • Android图片三级缓存的原理及其实现
    为什么要使用三级缓存 如今的 Android App 经常会需要网络交互,通过网络获取图片是再正常不过的事了 假如每次启动的时候都从网络拉取图片的话,势必会消耗很多流量。在当前的状况下,对于非wifi用户来说,流量还是很贵的,一个很耗流...
    99+
    2023-05-30
    android 图片 三级缓存
  • Android使用缓存机制实现文件下载及异步请求图片加三级缓存
    首先给大家介绍Android使用缓存机制实现文件下载 在下载文件或者在线浏览文件时,或者为了保证文件下载的正确性,需要使用缓存机制,常使用SoftReference来实现。 ...
    99+
    2022-06-06
    异步请求 三级缓存 图片 异步 缓存 Android
  • Android实现图片异步请求加三级缓存
    使用xUtils等框架是很方便,但今天要用代码实现bitmapUtils 的功能,很简单, AsyncTask请求一张图片 ####AsyncTask #####AsyncT...
    99+
    2022-06-06
    异步请求 三级缓存 图片 异步 缓存 Android
  • 浅谈Android 中图片的三级缓存策略
    什么是三级缓存? 内存缓存,优先加载,速度最快 本地缓存,次优先加载,速度快 网络缓存,最后加载,速度慢,浪费流量为什么要进行三级缓存三级缓存策略,最实在的意义就是 减少不必要的流量消耗,增加加载速度 。如今的 APP 网络交互似乎已...
    99+
    2023-05-30
    android 图片 三级缓存
  • Android中怎么实现图片缓存机制
    这期内容当中小编将会给大家带来有关Android中怎么实现图片缓存机制,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。Android 图片缓存机制的深入理解Android加载一张图片到用户界面是很简单的,但...
    99+
    2023-05-30
    android
  • android中图片的三级缓存cache策略(内存/文件/网络)
    1.简介 现在android应用中不可避免的要使用图片,有些图片是可以变化的,需要每次启动时从网络拉取,这种场景在有广告位的应用以及纯图片应用(比如百度美拍)中比较多。现在有一...
    99+
    2022-06-06
    图片 cache Android
  • Android ViewPager2中缓存和复用机制的示例分析
    这篇文章主要为大家展示了“Android ViewPager2中缓存和复用机制的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Android ViewPager2中缓存和复用机制的示例分...
    99+
    2023-06-25
  • LeetCode中LRU 缓存机制的示例分析
    这篇文章主要介绍了LeetCode中LRU 缓存机制的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。题目描述运用你所掌握的数据结构,设计和实现一个  LRU...
    99+
    2023-06-19
  • react-native源码图片缓存问题的示例分析
    小编给大家分享一下react-native源码图片缓存问题的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!为xcode模...
    99+
    2022-10-19
  • 浏览器中缓存机制的示例分析
    这篇文章主要介绍了浏览器中缓存机制的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。浏览器的缓存机制?认识浏览器缓存当浏览器请求一个网...
    99+
    2022-10-19
  • SpringBoot+SpringCache实现两级缓存的示例分析
    这篇文章给大家分享的是有关SpringBoot+SpringCache实现两级缓存的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。springboot是什么springboot一种全新的编程规范,其设计目...
    99+
    2023-06-14
  • IE浏览器中ajax缓存机制的示例分析
    小编给大家分享一下IE浏览器中ajax缓存机制的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下...
    99+
    2022-10-19
  • 从源代码分析Android Universal ImageLoader的缓存处理机制
    通过本文带大家一起看过UIL这个国内外大牛都追捧的图片缓存类库的缓存处理机制。看了UIL中的缓存实现,才发现其实这个东西不难,没有太多的进程调度,没有各种内存读取控制机制、没有...
    99+
    2022-06-06
    imageloader 源代码 缓存 Android
  • Android加载大分辨率图片到手机内存中的实例方法
    还原堆内存溢出的错误首先来还原一下堆内存溢出的错误。首先在SD卡上放一张照片,分辨率为(3776 X 2520),大小为3.88MB,是我自己用相机拍的一张照片。应用的布局很简...
    99+
    2022-06-06
    手机内存 方法 图片 分辨率 手机 Android
  • 如何实现Android中图片占用内存的深入分析
    小编今天带大家了解如何实现Android中图片占用内存的深入分析,文中知识点介绍的非常详细。觉得有帮助的朋友可以跟着小编一起浏览文章的内容,希望能够帮助更多想解决这个问题的朋友找到问题的答案,下面跟着小编一起深入学习“如何实现Android...
    99+
    2023-06-26
  • Linux下缓存机制free及清理buffer/cache/swap的示例分析
    这篇文章给大家分享的是有关Linux下缓存机制free及清理buffer/cache/swap的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。(1)缓存机制为了提高文件系...
    99+
    2022-10-18
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作