通过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. Android开发——Notification通知的各种Style详解

    本来是想与之前讲解使用Notification通知使用一起写的,查看了资料,觉得有必要将这Style部分单独拿出来讲解 前篇:Android开发——Notification通知的使用及Notifica ...

  2. 【eclipse】eclipse报错:the resource is not on the build path of a java project

    最近在eclipse中,使用svn导入svn上的一个maven项目,但是导入后类的包并没有以源码包的方式显示,而是以普通文件包的方式显示出来,在对类进行F3等操作时就报错:“the resource ...

  3. 【学习笔记】tensorflow队列和线程

    目录 Tensorflow队列 同步执行队列 队列管理器 异步执行队列 线程协调器 在使用TensorFlow进行异步计算时,队列是一种强大的机制. 为了感受一下队列,让我们来看一个简单的例子.我们先 ...

  4. sql server2008数据库迁移的两种方案

    方案一 1,先将源服务器上的数据库文件打包(包括mdf和ldf文件),并且复制到目标服务器上. 2,解压,然后在目标服务器上附加数据库 总结:适合数据库巨大(50GB以上),需要快速迁移数据,并且移动 ...

  5. webpack入门教程--2

    这次是创建第二个JS文件. 我们还是在app文件夹中创建一个叫做book2.js的JS文件,并在其中输入以下代码: module.exports = "It works from book2 ...

  6. 前端js 实现文件下载

    https://www.zhangxinxu.com/wordpress/2017/07/js-text-string-download-as-html-json-file/ 侵删 1.H5 down ...

  7. Lyndon Word学习笔记

    Lyndon Word 定义:对于字符串\(s\),若\(s\)的最小后缀为其本身,那么称\(s\)为Lyndon串 等价性:\(s\)为Lyndon串等价于\(s\)本身是其循环移位中最小的一个 性 ...

  8. HTML和CSS前端教程03-CSS选择器

    目录 1. CSS定义 2. 创建CSS的三种方法 2.1. 元素内嵌(权重最高) 2.2. 文档内嵌 2.3. 外部引用 3. CSS层叠和继承 3.1. 浏览器样式 3.2. 样式表层叠 3.3. ...

  9. 微信小程序(七)文章详情页面动态显示

    文章详情页面动态显示(即点击某个文章就跳转到相应文章的详情页): 思路:在文章列表页面添加catchtop事件,在js文件中获取文章的index,并用wx.navigateTo中的 url拼接详情页的 ...

  10. idea连接服务器上传jar并运行

    .打开idea tools-deployment-configuration..                                   .打开如图 点击 + 号           .如 ...