图片三级缓存的流程

三级缓存的内容:

1. 从内存中获取图片,有,加载显示

2. 如果内存中没有,从本地获取图片,有加载显示,并且将图片缓存到内存,为下一次显示准备

3. 如果本地也没有,从网络下载图片,下载完成,显示图片,通过缓存到内存,保存到本地文件中,为下一次显示准备

在内存中获取图片有两种方式

第一种:软引用的方式(不太常用了)

强引用: user = new UserInfo(), 不会轻易被系统回收

软引用: SoftReference<Bitmap>, 当内存不足的时候,系统会回收软引用

弱引用: WeakReference<Bitmap>, 当内存不足的时候,系统会回收弱引用,如果软引用和弱引用同时存在,先回收弱引用

虚引用: PhantomReference<Bitmap>, 当内存不足的时候,系统会回收弱引用,优先级低于弱引用

第二种:LruCache方式

判断最新一段时间内的图片引用的次数,判断是否需要缓存,将使用频率比较高的音乐缓存到内存中去

1、创建LruCache对象

public MyCacheBitmapUtils(){

//map = new HashMap<String, SoftReference<Bitmap>>();

//maxSize :  缓存空间大小,一般是总内存的 8 分之一

int maxSize = (int) (Runtime.getRuntime().totalMemory()/8);

lruCache = new LruCache<String, Bitmap>(maxSize){

// 获取缓存图片的 大小

@Override

protected int sizeOf(String key, Bitmap value) {

//value.getRowBytes() :  获取图片一行占用的字节数

return value.getRowBytes() * value.getHeight();

}

};

}

2、缓存图片

public void saveBitmap(String url,Bitmap bitmap){

//SoftReference<Bitmap> softReference = new SoftReference<Bitmap>(bitmap);// 使用软引用修改 bitmap 引用

//map.put(url, softReference);

lruCache.put(url, bitmap);

}

3、获取缓存图片

public Bitmap getBitmap(String url){

/*SoftReference<Bitmap> softReference = map.get(url);

// 确认软引用没有被回收

if (softReference != null) {

Bitmap bitmap = softReference.get();

return bitmap;

}*/

Bitmap bitmap = lruCache.get(url);

return bitmap;

}

4、将上面三步放到一个工具类中 通过工具类调用

本地缓存

通过IO流操作 保存和读取文件

1、保存图片

File file = new File(dr, MD5Util.Md5(url).substring(0, 10));

FileOutputStream stream = new FileOutputStream(file);

// 设置图片类型质量,将图片保存本地文件中

// 参数 1 :图片格式

// 参数 2 :图片的质量

// 参数 3 :写入流

bitmap.compress(CompressFormat.JPEG, 100, stream);

2、获取图片

File file = new File(PATH, MD5Util.Md5(url).substring(0, 10));

Bitmap bitmap = BitmapFactory.decodeFile(file.getAbsolutePath());

return bitmap;

网络获取

URL mUrl = new URL(url);

HttpURLConnection con = (HttpURLConnection) mUrl.openConnection();

con.setConnectTimeout(5000);// 设置链接超时时间

con.setReadTimeout(5000);// 设置读取超时时间

con.connect();// 链接网络操作

int code = con.getResponseCode();// 获取服务器响应码

if (code == 200) {

// 获取服务器数据,以流的形式返回

InputStream stream = con.getInputStream();

Bitmap bitmap = BitmapFactory.decodeStream(stream);

return bitmap;

}

此处采用HttpURLConnection进行网络操作

时间: 2024-10-13 00:31:30

图片三级缓存的流程的相关文章

Android实战——RxJava2解锁图片三级缓存框架

RxJava2解锁图片三级缓存框架 本篇文章包括以下内容 前言 图片三级缓存的介绍 框架结构目录的介绍 构建项目整体框架 实现图片三级缓存 演示效果 源码下载 结语 前言 RxJava2作为如今那么主流的技术,不学习学习都不行了,本篇文章需要你有RxJava2的基础,如果需要对RxJava2学习的同学,可以关注我的博客,查看Android实战--RxJava2+Retrofit+RxBinding解锁各种新姿势 .项目代码实现模仿Picasso,大伙们可以看下最后的代码效果,那么废话不多说,He

属性动画与图片三级缓存

属性动画 动画: UI渐变, 变量值的变化 ObjectAnimator : ofInt("backgroundColor",start,end); ValueAnimator: for(int i = start; i< end; i++) { a = i; } ValueAnimator animation=ValueAnimator.ofInt(start,end); animation.setDuration(DURATION); animation.addUpdateL

图片三级缓存的原理

三级缓存的概念: 内存-->硬盘-->网络 由内存.硬盘.网络缓存形成. 关于三级缓存用到的技术: Android高效加载大图.多图解决方案.有效避免程序OOM使用的核心技术就是LruCache. LruCache只是管理了内存中图片的存储与释放,如果图片从内存中被移除的话,那么又需要从网络上重新加载一次图片,这显然非常耗时.对此,Google又提供了一套硬盘缓存的解决方案:DiskLruCache(非Google官方编写,但获得官方认证. 用法和流程: 当每次加载图片的时候都优先去内存加载图

Android图片三级缓存策略

1.简介 Android缓存原理都是一样,可以自己封装. 三级缓存: 1.内存缓存:缓存在内存中,基于LRU(least recently used )算法,机器重启消失. 2.本地缓存.缓存在本地中.一般键值对形式.(url,filepath) 3.网络缓存.从网络加载资源,然后缓存在内存.本地中. 2.实现步骤 2.1 内存缓存: [java] view plain copypublic class MemoryCacheUtils { private LruCache<String,Bit

Android 图片三级缓存加载框架原理解析与代码实现

本文主要介绍三级缓存的原理解析与实现方式.以前一直觉得三级缓存图片加载是一个很难理解的东西,但是自己看了一下午再试着写了一遍之后感觉还是只要沉下心思考还时很容易熟悉掌握的. 所谓三级缓存:首先是内存-文件(外存)-网络三级缓存机制. 首先: 框架需要一个接入方法NGImageloadHelper.java: /** * 图片加载框架使用帮助类 * Created by nangua on 2016/7/8. */ public class NGImageloadHelper { /** * 处理

图片三级缓存

http://blog.csdn.net/singwhatiwanna/article/details/17566439 package com.example.android.camera2basic; import android.Manifest; import android.app.Activity; import android.app.AlertDialog; import android.app.Dialog; import android.app.DialogFragment;

Android进阶图片处理之三级缓存方案

图片的三级缓存 一.概述 一開始在学习Android的时候.处理图片的时候,每次获取图片都是直接从网络上面载入图片. 可是在开发项目的过程中,每次点击进入app里面,图片都要慢慢的再一次从网络上面载入. 给用户的体验很不好,第一个等待的时间很令人dan 疼 第二个给用户的流量造成了不必要的浪费 因此提出图片的三级缓存策略, 所谓的三级缓存:就是在手机载入图片的时候, 1.首先从内存中载入, 2.假设内存中没有的话,从sd卡上获取.读取到之后将图片写入到内存中 3.假设sd卡上没有的话,从网络上获

浅谈图片载入的三级缓存(一)

之前被人问及过.图片的三级缓存是什么啊,来给我讲讲,图片三级缓存,好高大尚的名字,听着挺厉害,应该是非常厉害的技术.当时不会啊,也就没什么了.没有说出来呗,前一阶端用到了BitmapUtils的图片缓存框架,索性就自己找些知识点来研究一些图片的三级缓存是什么吧.真所谓是知识你要是不知道,那就真的说不出所以然来.可是当你真正的去了解了.三级缓存也不是那么高端的技术. 好了,闲话不多说了.開始图片的三级缓存原理吧. 什么是图片的三级缓存 1.内存缓存 优先载入,速度最快 2.本地缓存 次优先载入 速

Android三级缓存机制工具类的实现

一.三级缓存概述 (一)三级缓存的三级 第一级是内存,最快,不需要网络 第二级是本地,不需要网络 第三级是网络,需要网络请求 三级缓存机制的思想: 如果在内存中获取到数据,就不去本地和网络中获取. 如果在本地中获取到数据就不去网络中获取, 如果内存和本地中不存在数据,就要去网络中请求数据 三级缓存技术能有效节省用户的流量,但是也会增加一些内存负担. 二.使用示例展示三级缓存工具栏类的使用 程序运行后的页面: 虽然只用一个按钮和一个图片显示,但是通过测试(联网状态和断网状态对比)能知道图片是从网络