Android之Bitmap高效缓存以及android缓存策略

第十二章-Bitmap的加载和Cache(缓存策略、LruCache、DiskLruCache) 本章的主题是Bitmap的加载和Cache,主要包含三个方面的内容。首先讲述如何有效的加载一个Bitmap,这是一个很有意义的话题,由于Bitmap的特殊性以及Android对单个应用所施加的内存限制,比如16MB,这就导致加载Bitmap的时候很容易的出现内存溢出。下面这个异常在开发中应该时常遇到: java.lang.OutofMemoryError:bitmap size exceeds V... 阅读详情

Android之Bitmap高效缓存

一、Bitmap高效加载

1、bitmap的基本概念

位图:获取像素值进行加载。

Bitmap是Android系统中图像处理中的最重要的一个类。

通过Bitmap我们也看获取图片的信息

获取到信息后,我们可以对其进行缩放、裁剪等操作
2、Bitmap的加载方式

Bitmap有一些几种加载方式:

	BitmapFactory.decodeResource(); 	资源ID
	BitmapFactory.decodeStream();		流(网络)
	BitmapFactory.decodeByteArray();	字节数组
	BitmapFactory.decodeFile();		文件路径

3、如何高效加载Bitmap

防止内存溢出
尽可能的节省内存的开销
使我们的应用运行更加流畅

	BitmapFactory.Options为我们高效加载提供看可能。
	injustDecodeBounds 值获取宽和高
	outWidth&outHeight
	insmallSize 采样率
工具类
package com.example.jash.bitmap;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;

/**
 * Created by jash on 2017/12/24.
 */
public class BitmapUtils {
    /**
     * 压缩方法
     *
     * @param filepath 文件路径
     * @param pixelw   真正显示的宽度
     * @param piexlh   真正显示高度
     * @return
     */
    public static Bitmap ratio(String filepath, int pixelw, int piexlh) {
        BitmapFactory.Options options = new BitmapFactory.Options();
//        只加载图片的宽和高,不加载图片深圳的内容
        options.inJustDecodeBounds = true;
//        位深度,566 低  内存占用小
        options.inPreferredConfig = Bitmap.Config.RGB_565;
//      预加载  之后可以获取宽和高
        BitmapFactory.decodeFile(filepath, options);
//        获取原始的宽和高
        int originalw = options.outWidth;
        int originalh = options.outHeight;
//        采样
        options.inSampleSize = getSimpleSize(originalw, originalh, pixelw, piexlh);
//        真正加载
        options.inJustDecodeBounds = false;
        return BitmapFactory.decodeFile(filepath, options);
    }

    private static int getSimpleSize(int originalw, int originalh, int pixelw, int piexlh) {
        int simpleSize = 1;
        if (originalw > originalh && originalw > pixelw) {
            simpleSize = originalw / pixelw;
        } else if (originalh > originalw && originalh > piexlh) {
            simpleSize = originalh / piexlh;
        }
        if (simpleSize <= 0) {
            simpleSize = 1;
        }
        return simpleSize;
    }
}
缓存的概念:
缓存就是将从服务器获取到的json或者file等保存到本地,
缓存的优势:对一下不经常发生变化的数据,直接使用本地缓存,提升响应速度
	    不在频繁的请求服务器,减少服务器的负载
	     离线阅读等
使用场景:对Bitmap或者是file大数据进行缓存,无需每次都重新下载,尤其是ListView
	  数据不需要适时的更新,离线

缓存策略:	LruCache内存缓存
		DIskLruCache硬盘缓存
		Sql实现缓存(持久  不建议)
LruCache缓存
1、Lru是计算机科学经常使用的一种《近期最少使用的算法》
2、内部采用的是LinkedHashMap
注意问题:
1、内存缓存使用的是我们宝贵的内存资源,需要系统动态的调整内存的大小
2、注意版本适配,建议使用sopportv4包中的LruCache
方法:
package com.example.jash.bitmap;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.util.LruCache;
import android.widget.ImageView;

import java.io.IOException;

import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;

/**
 * Created by jash on 2017/12/24.
 * 用于加载网络图片,并缓存到本地或者内存中
 */
public class SimpleImageLoader {
    private static SimpleImageLoader mloader;
    private LruCache<String, Bitmap> mLrucache;
    public static SimpleImageLoader getInstance() {
        if (mloader == null) {
            synchronized (SimpleImageLoader.class) {
                if (mloader == null) {
                    mloader = new SimpleImageLoader();
                }
            }
        }
        return mloader;
    }


    //    用来初始化缓存对象
    private SimpleImageLoader() {
        int maxSize = (int) Runtime.getRuntime().maxMemory() / 8;
        mLrucache = new LruCache<String, Bitmap>(maxSize) {
            @Override
            protected int sizeOf(String key, Bitmap value) {
                return value.getByteCount();
            }
        };
    }

    /**
     * 用于加载网络图片
     * @param view
     * @param url
     */
    public void displayImage(ImageView view, String url) {
        Bitmap bitmap = getBitmapFromcache(url);
        if (bitmap != null) {
            view.setImageBitmap(bitmap);
        } else {
            downLoadImage(view, url);
        }
    }


    /**
     * 从缓存中读取图片
     *
     * @param url
     * @return
     */
    private Bitmap getBitmapFromcache(String url) {
        return mLrucache.get(url);
    }

    /**
     * 将下载下来的图片保存到缓存中
     *
     * @param bitmap
     * @param url
     */
    private void putBitmapToCache(Bitmap bitmap, String url) {
        if (bitmap != null) {
            mLrucache.put(url, bitmap);
        }
    }

    private void downLoadImage(final ImageView imageView, final String url) {
        OkHttpClient client = new OkHttpClient();
        final Request request = new Request.Builder().get()
                .url(url)
                .build();
        client.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {

            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                byte[] bytes = response.body().bytes();
                Bitmap bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
                putBitmapToCache(bitmap, url);
            }
        });

    }
}
main类中
package com.example.jash.bitmap;

import android.graphics.BitmapFactory;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageView;

import com.squareup.picasso.Picasso;

public class MainActivity extends AppCompatActivity {

    private ImageView image;
    private final String IMAGE_URL = "http://img1.qq.com/ent/20050913/2312751.jpg";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        image = (ImageView) findViewById(R.id.down_image);
    }

    public void dowm(View view) {
        SimpleImageLoader loader = SimpleImageLoader.getInstance();
        loader.displayImage(image, IMAGE_URL);
    }
}
DiskLruCache硬盘缓存:
第三方开源库:
	1、通过DiskLruCache.open去初始化一个缓存对象
	2、通过DiskLruCache.get(String key)去获取到本地key下的缓存文件
	3、通过DiskLruCache.Editor对象将数据保存到本地
注意问题:
	1、根据外部存储设置合适的缓存路径;
		有外置/sdcard/Android/data/包名/cache
		无外置/data/data/Android/data/包名/cache
	2、缓存文件对key的命名有特殊要求
待完善!………………















Android进阶之Bitmap的高效加载 一、Bitmap的加载 BitmapFactory提供了四个方法: docodeFiles decodeResource decodeStream decodeByteArray 二、Bitmap的高效加载 采用Bitmap.Options来加载所需尺寸的图片,主要使用它的inSampleSize参数,当inSampleSize大于1缩放。(inSampleSize会向下去2的指数) ... 阅读详情

相关推荐

soul聊天协议逆向

通过观察上面的CFG发现,该混淆符合以下逻辑,整体思路就是先查找主分发器,一般被引用次数最多的那个块就是主分发器,引用主分发器的块大概率是真实块,再使用unicorn模拟执行,遍历每一个分支,记录每一个块,如果某一个块是上次记录的块则也为真实块,无后继的块则为retn块,剩下的就是无用块。通过Frida Hook libc.so后发现,聊天协议走的是JAVA层的socket,然后Hook JAVA层相关函数得到如下调用堆栈。里面调用的函数不是很多,所以。不行不行,革命要彻底!

2503_90751789的博客 3215

Android中级——Bitmap加载和Cache

大图片处理问题示例解决办法 问题示例 activity_main.xml中有一个Button和ImageView <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http:

松仔Log的博客 2328

MDM主数据清洗和编码集成说明

绝大多数的企业业务系统是伴随业务发展而建设的,但随着业务发展单一系统难以支撑企业业务闭环。MDM主数据管理平台可以满足企业数据治理的需求,本文针对主数据清洗和编码集成进行梳理。...

数通畅联 3321

Android---Bitmap详解

Bitmap开发中的几个常见问题:一张图片被加载成Bitmap后实际占用内存是多大;通过Options.inBitmap可以实现Bitmap的复用,但是有一定的限制;当界面需要展示多张图片,尤其是在列表视图中,可以考虑使用Bitmap缓存;如果需要展示的图片过大,可以考虑使用分片加载的策略。

qq_44950283的博客 1690

基于强化学习的工业SCR脱硝系统控制算法设计与实现

本文提出了一种基于强化学习的工业SCR脱硝系统智能控制方法。针对SCR系统存在的非线性、大滞后和多变量耦合等控制难点,研究采用混合建模方法构建了精度在5%以内的系统模型,并设计了专门的强化学习环境。该方法通过定义合理的动作空间和状态空间,结合物理约束设计损失函数,利用深度强化学习算法优化氨喷射控制策略。相比传统PID控制,该智能控制器能更好地适应烟气参数波动,实现NOx排放的稳定控制,为工业环保设施提供了更优的自动化解决方案。

huanghm88的专栏 1459

保姆级教程:在Ubuntu 22.04上搞定PX4 V1.14 + ROS2 Humble的HITL仿真(避坑实录)

本文提供在Ubuntu 22.04上配置PX4 V1.14与ROS2 Humble的HITL仿真环境的详细教程,涵盖环境准备、固件编译、QGroundControl配置、ROS2通信设置及联调测试。特别针对版本兼容性、Gazebo插件构建和MicroDDS配置等常见问题提供避坑指南,帮助开发者高效搭建无人机仿真系统。

weixin_30836759的博客 1006

Android Bitmap详解(下)之图片缓存详解

public static Bitmap createScaledBitmap(Bitmap src, int dstWidth, int dstHeight, boolean filter)//以src为原图,创建新的图像,指定新图像的高宽以及是否可变。public static Bitmap createBitmap(Bitmap source, int x, int y, int width, int height)以source为原图,创建新的图片,指定起始坐标以及新图像的高宽。

hirezy 2248

别再到处找模板了!手把手教你用Vue3+Element Plus搭建一个‘能跑起来’的管理后台原型

本文详细介绍了如何利用Vue3和Element Plus在72小时内快速搭建一个功能完整的管理后台原型。从环境准备到项目获取、依赖安装、原型定制、数据模拟以及构建优化,手把手教你打造一个可直接演示的后台系统,特别适合创业者快速验证产品逻辑。

weixin_26854555的博客 183

Android 图片缓存之 Bitmap 详解

public static Bitmap createScaledBitmap(Bitmap src, int dstWidth, int dstHeight, boolean filter)//以src为原图,创建新的图像,指定新图像的高宽以及是否可变。public static Bitmap createBitmap(Bitmap source, int x, int y, int width, int height)以source为原图,创建新的图片,指定起始坐标以及新图像的高宽。

qq_33209777的博客 994

Loki 分布式日志中心服务

分布式日志中心 Loki + Promtail + Grafana

原名又逢乱世。不要放下学习的脚步,毕竟比天天打牌、钓鱼、打游戏更能从内在充实自己。 2355

第3.1.3章 机器人第三方库实战总结:ROS 2 入门实战及和ROS1的对比,打通机器人开发的任督二脉

本文针对机器人SLAM开发中第三方库的学习痛点,重点介绍ROS 2在SLAM中的应用。文章首先对比ROS 1与ROS 2的核心差异,梳理ROS 2知识图谱,包括节点、话题、服务等核心概念。通过实战项目演示如何构建激光SLAM节点,结合代码详解运行流程。最后给出学习建议,强调动手实践的重要性,帮助开发者快速掌握ROS 2在SLAM开发中的关键应用。

行知SLAM 181

Bitmap 优化策略

如今市场上有很多封装好的第三方库,对Bitmap内存也是做到了很好的优化,比如Glide、Fresco,每次加载只要直接调用就好,但是除掉第三方库外,我们还是需要去了解一下Bitmap的基本优化手段。 一、Bitmap内存进程 首先我们有必要去了解一下Bitmap的基本知识点,在Android3.0之前,Bitmap的对象是放在Java堆中,而Bitmap的像素是放置在Native内存中,这个时候需要手动的去调用recycle,才能去回收Native内存; 在Android3.0到Android7.0

dengpeng_的博客 850

1553B总线介绍及其硬件方案设计

军用1553B总线 1.简介 简单介绍可参考(https://blog.youkuaiyun.com/ScilogyHunter/article/details/108444231)博主写的很详细。 1553B总线是MIL-STD-1553总线的简称,其中B就是BUS,MIL-STD-1553B总线是飞机内部时分制命令/响应式多路复用数据总线。1553B数据总线标准是20世纪70年代由美国公布的一种串行多路数据总线标准。1553B总线能挂31个远置终端,1553B总线采用指令/响应型通信协议,它有三种终端类型: BC:

小幽余生不加糖 1万+

Bitmap高效加载及Android缓存策略

1、 2、 3、 4、 5、 6、 7、 8、 9、 10、 11、 12、 13、 14、

nicolelili1的专栏 251

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Android进阶:Bitmap的高效加载和Cache,Android春招实习面试经验汇总

二、Android中的缓存策略 =============== 缓存策略在Android中应用广泛。使用缓存可以节省流量、提高效率。 加载图片时,一般会从网络加载,然后缓存在存储设备上,这样下次就不用请求网络了。并且通常也会缓存一份到内存中,这样下次可以直接取内存中的缓存,要比从存储设备中取快很多。所以一般是先从内存中取,内存没有就取存储设备,也没有才会请求网络,这就是所谓的“三级缓存”。此策略同样适用其他文件类型。 缓存策略中的操作有 添加缓存、获取缓存、删除缓存。添加和获取比较好理解,删除缓存是啥意思?

m0_64604893的博客 202

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Bitmap高效加载、Cache和优化(一)

Bitmap在Android开发中经常会用到,高效加载Bitmap就显得很重要了,节省流量,加快加载速度,不出现卡顿现象这是我们想要达到的目的。 Android常用的缓存策略也是很重要的,Bitmap也需要做缓存,主要有两种,内存缓存和存储缓存,当请求加载图片时,先从内存缓存中找,找不到就到存储缓存中找,在存储缓存中也没有就从网络加载。缓存主要使用的是Lru算法,即是最近最少使用算法 ,当缓存不

我就是王大大的博客 2239

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Android开发艺术探索 - 第12章 Bitmap的加载和cache

1.Bitmap高效加载 加载Bitmap的方法:使用BitmapFactory的decodeFile/decodeResource/decodeStream/decodeByteArray可以分别从,文件/资源/输入流/字节数组中加载一个Bitmap。decodeFile/decodeResource会间接调用decodeStream。 通过采样率控制加载出的Bitmap的大小,以提高加载效率:...

Think,Make 492

Connor学Android - Bitmap的加载和缓存策略

Hey,欢迎阅读Connor学Android系列,这个系列记录了我的Android原理知识学习、复盘过程,欢迎各位大佬阅读斧正!原创不易,转载请注明出处:http://t.csdn.cn/n6ljR,话不多说我们马上开始!

ConnorYan的博客 843

Bitmap的高效加载以及缓存机制

在实际的开发过程中,经常会对图片进行获取,并为用户展示在界面。由于android系统对每个应用有一定的内存限制,如果不合理的利用就会造成内存泄漏的情况。因此,在加载bitmap时进行恰当的优化,可以节省系统资源。另外,在进行网络、文件系统获取图片资源时,采用缓存机制,减少网络获取次数,会让应用更流畅,用户体验更友好。下面就从bitmap的高效加载、LruCache、DiskLruCache这三方面...

小猪的博客 1388

第十二章 、Bitmap的加载和Cache

第十二章 、Bitmap的加载和Cache 目前常用的缓存策略是LruCache和DiskLruCache,其中LruCache常被用作内存缓存,而DiskLruCache常被用作存储缓存。 Lru是Least Recently Used的缩写,即最近最少使用算法。 1. Bitmap的高效加载 BtimapFactory提供了四种加载方法 decodeFile 文件系统 decodeResour

sp不会玩ps 422

Bitmap的加载和Cache

本章的主题是Bitmap的加载和Cache,主要包含三个方面的内容。首先讲述如何有效地加载一个Bitmap,这是一个很有意义的话题,由于Bitmap的特殊性以及Android对单个应用所施加的内存限制,比如16MB,这导致加载Bitmap的时候很容易出现内存溢出。下 面这个异常信息在开发中应该时常遇到: java.lang.OutofMemoryError: bitmap size exceeds VM budget 因此如何髙效地加载Bitmap是一个很重要也很容易被开发者忽视的问题。 接着介绍.

悟心的专栏 389

Android Bitmap(位图)详解

一、背景 在Android开发中,任何一个APP都离不开图片的加载和显示问题。这里的图片来源分为三种:项目图片资源文件(一般为res/drawable目录下的图片文件)、手机本地图片文件、网络图片资源等。图片的显示我们一般采用ImageView作为载体,通过ImageView的相应API即可设置其显示的图片内容。 我们知道:如果是需要展示项目中的图片资源文件,我们只需要调用ImageView的...

weixin_30763455的博客 741

Android 开发艺术探索笔记之十二 -- Bitmap 的加载和 Cache

学习内容: 如何有效加载 Bitmap Android 常用的缓存策略 LurChche - 内存缓存 DiskLurCache - 存储缓存 优化列表的卡顿现象 1. Bitmap 的高效加载 如何加载图片? 四类方法: BitmapFactory.decodeFile / decodeResource / decodeStream / decodeByteArra...

whdAlive 's blog 476

Android进阶:Bitmap的高效加载和Cache,解析底层原理

Log.i(TAG, “initView: outWidth=”+outWidth+",outHeight="+outHeight); //3、原始宽高信息 和 view的大小 计算并设置采样率 ViewGroup.LayoutParams layoutParams = ivBitamp.getLayoutParams(); int inSampleSize = getInSampleSize(layoutParams.width, layoutParams.height, outWidth, outHei

m0_64604042的博客 710

Android手机采集can数据,Android中Bitmap的加载和Canche总结篇

一:Bitmap的高效加载BitmapFactory类提供了四类方法:decodeFile,decodeResource,decodeStream和decodeByteArray,分别用于支持从文件系统,资源,输入流以及字节数组中加载出一个Bitmap对象,其中decodeFile和decodeResource又间接调用了decodeStream方法,这四类方法最终是在Android的底层实现的,...

weixin_36307834的博客 647

Bitmap的加载和缓存

Bitmap的高效加载 Bitmap 在Android中指的是一张照片,可以是Png格式也可以是Jpg等其他常见的图片格式。那么如何加载一个图片呢? BitmapFactory类提供了四种方法: decodeFile 从文件系统 decodeResource 从资源 decodeStream 从输入流 decodeByteArray 从字节数组 其中decodeFile 和 decodeRes...

weixin_33797791的博客 85
上一篇: Android之ZXing扫描二维码以及生成二维码
下一篇: pagerAdapter 与FragmentPagerAdapter的区别
JSON_ZJS
博客等级 码龄9年 30粉丝 159原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值