通过Bitmap我们可以设计一个ImageLoader,实现应该具有的功能是:

图片的同步加载;图片的异步加载;图片的压缩;内存缓存;磁盘缓存;网络获取;

1.加载

首先提到加载:BitmapFactory类提供了四类方法:decodeFile、decodeResource、decodeStream和decideByteArray。分别是文件系统、资源、输入流和字节数加载Bitmap对象。

2.压缩

如何进行图片的压缩?首先我们为什么图片压缩呢?因为很多时候ImageView尺寸小于图片原始尺寸,没必要把原始图片全部加载到内存,可能造成oom,并且ImageView也没办法全部显示原始图片,采样压缩将缩小后的图片在ImageView中显示,同时降低图片内存占用从而避免oom,提高Bitmap加载性能。图片内存太大会影响用户的体验,而且对设备存储也是浪费了资源。怎么压缩?通过BitmapFactory.Options来缩放图片,主要是inSampleSize参数,叫采样率。inSampleSize=1就是和原图一样,inSampleSize=4,加载后的图片长和宽是原图片长和宽的1/4,像素数是原图片的1/16,加载后占用的内存也是原图片占用内存的1/16.

其中步骤是:

(1)BitmapFactory.Options的inJustDecodeBound参数设为true并加载图片;

(2)从BitmapFactory.Options中取出图片原始宽高信息,对应outWidth和outHeight

(3)结合目标view(imageView)所需图片大小,计算采样率;

(4)将BitmapFactory.Options的inJustDecodeBounds置为false,重新加载。

3.缓存

其中内存缓存与磁盘缓存是最为核心的,缓存就是为了移动端服务的,例如:有一大批的网络图片,需要下载后才能在用户界面上显示,如果是在PC端可以直接下载到本地进行显示,但是在移动端我们都是需要大量的流量进行下载,为了解决流量消耗的问题,缓存就是我们的不二之选,有了缓存我们从网络第一次网络加载之后,图片缓存在我们的设备之中,当我们再次查询图片的时候,就不用再次从网络上获取,而是先从设备的缓存上进行获取,如果没有,再考虑从网络上获取,这就是缓存策略。

目前我们常用的缓存算法是LRU算法,就是近期最少使用算法,核心就是如果缓存存满时候,有优先淘汰那些近期最少使用的缓存对象。说到LRU其中的两种缓存:LruCahe与DisKLruCahe,前者是用于实现内存缓存,后者则是充当了储存设备的缓存。

这次我介绍了Bitmap 的加载与缓存,下次我们进一步的分析具体代码。

Android艺术——Bitmap高效加载和缓存(1)的更多相关文章

  1. Android艺术——Bitmap高效加载和缓存代码分析(2)

    Bitmap的加载与缓存代码分析: 图片的压缩 比如有一张1024*768像素的图像要被载入内存,然而最终你要用到的图片大小其实只有128*96,那么我们会浪费很大一部分内存,这显然是没有必要的,下面 ...

  2. Android之Bitmap 高效加载

    一张图片(BitMap)占用的内存=图片长度*图片宽度*单位像素占用的字节数 图片格式(Bitmap.Config) 一张100*100的图片占用内存的大小 ALPHA_8 图片长度*图片宽度 100 ...

  3. Android开发之高效加载Bitmap

    一.概述 在Android开发中,我们经常与Bitmap打交道,而对Bitmap的不恰当的操作经常会导致OOM(Out of Memory).这篇文章我们会介绍如何高效地在Android开发中使用Bi ...

  4. Bitmap的加载与缓存

    Android系统中图片一般用Bitmap对象表示,它支持png,jpg等常见格式.通常情况下图片的体积都比较大,单个应用允许使用的内存又是有限的,所以我们需要采取一些手段减少内存占用并提高加载速度. ...

  5. Android开发艺术探索》读书笔记 (12) 第12章 Bitmap的加载和Cache

    第12章 Bitmap的加载和Cache 12.1 Bitmap的高速加载 (1)Bitmap是如何加载的?BitmapFactory类提供了四类方法:decodeFile.decodeResourc ...

  6. Android高效加载大图、多图解决方案,有效避免程序OOM

    高效加载大图片 我们在编写Android程序的时候经常要用到许多图片,不同图片总是会有不同的形状.不同的大小,但在大多数情况下,这些图片都会大于我们程序所需要的大小.比如说系统图片库里展示的图片大都是 ...

  7. Android高效加载大图、多图解决方案,有效避免程序OOM(转)

    本篇文章主要内容来自于Android Doc,我翻译之后又做了些加工,英文好的朋友也可以直接去读原文. http://developer.android.com/training/displaying ...

  8. [翻译]Bitmap的异步加载和缓存

    内容概述 [翻译]开发文档:android Bitmap的高效使用 本文内容来自开发文档"Traning > Displaying Bitmaps Efficiently", ...

  9. Android高效加载大图、多图解决方案,有效避免程序内存溢出现象

    好久没有写博客了,今天就先写一个小的关于在Android中加载大图如何避免内存溢出的问题. 后面会写如何使用缓存技术的核心类,android.support.v4.util.LruCache来加载图片 ...

随机推荐

  1. [PHP]MySQL的wait_timeout与pdo对象

    1.查看和设置mysql的wait_timeout的值 SHOW GLOBAL VARIABLES LIKE '%timeout%'; 设置wait_timeout的值 SET GLOBAL wait ...

  2. php将表单中数据传入到数据库

    <html> <head> <meta http-equiv="Content-Type" content="text/html; char ...

  3. 浏览器与Node的事件循环(Event Loop)有何区别?

    前言 本文我们将会介绍 JS 实现异步的原理,并且了解了在浏览器和 Node 中 Event Loop 其实是不相同的. 一.线程与进程 1. 概念 我们经常说 JS 是单线程执行的,指的是一个进程里 ...

  4. MS SQL自定义函数IsPositiveInteger

    判断字符串是否为正整数,0开始的的数字不算. SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE FUNCTION [dbo].[svf_I ...

  5. Lcd(一)显示原理

    一.LCD控制原理 S5PV210处理器中自带LCD控制器,控制LCD的显示,把 LCD 图像数据从一个位于系统内存的 video buffer 传送到一个外部的 LCD 驱动器接口. 类型: STN ...

  6. CFS调度器(1)-基本原理

    首先需要思考的问题是:什么是调度器(scheduler)?调度器的作用是什么?调度器是一个操作系统的核心部分.可以比作是CPU时间的管理员.调度器主要负责选择某些就绪的进程来执行.不同的调度器根据不同 ...

  7. Go语言学习笔记-函数部分(三)

    函数部分 函数基本组成:关键字func.函数名.参数列表.返回值.函数体.返回语句 例子: func Add(int a, int b) (return int, err error){ ....函数 ...

  8. ThinkPHP中使用聚合查询去重求和

    我使用的是TP5.1 首先去model类里面设置failed条件: 想要的效果: 数据库展示: 代码: eturn self::alias('gr') ->join('gs_staff gs', ...

  9. RabbitMQ持久化

    我们知道,如果消息接收端挂了,消息会保存在队列里.下次接收端启动就会接收到消息. 如果RabbitMQ挂了怎么办呢?这时候需要将消息持久化到硬盘 消息发送端:producer ........... ...

  10. 【Python 18】BMR计算器2.0(数值类型转换与while循环)

    1.案例描述 基础代谢率(BMR):我们安静状态下(通常为静卧状态)消耗的最低热量,人的其他活动都建立在这个基础上. 计算公式: BMR(男) = (13.7*体重kg)+(5.0*身高cm)-(6. ...