文档章节

BitmapFun解析

今日竹石
 今日竹石
发布于 2015/06/11 17:46
字数 1057
阅读 373
收藏 7
点赞 0
评论 0
  • 如果图片资源是静态的,当我们要在View上显示图片时,只需要简单的将图片赋值给ImageView就可以了,但如果需要浏览网络上的图片时该如何做呢?有可能图片很大,有可能网速很慢并且不稳定,这种情况下该如何增加用户体验。Android官方的BitmapFun示例程序已经给了我们很好的解决方法 - 其实万变不离其中,还是采用了提升性能的两种常用方法:异步和缓存。

     

    不多说我们先来看BitmapFun的主要类图:

     

     

    ImageWorker:这个是加载图片的核心类,建议大家看源代码从这个类看起。它的主要功能是从内存/磁盘缓存中加载图片,或者是从网络上下载。这里第一要使用缓存,第二从网络上下载,必然要使用异步线程,所以这里从类图中大家也可以看到它有两个关联类BitmapWorkerTask(继承自AsynTask)和ImageCache, 分别用来处理异步和缓存。

     

    ImageWorker提供给外部的主要接口是loadImage方法 - 加载图片,如果内存中有,直接加载。否则使用异步线程(BitmapWorkerTask)后台加载 - 从磁盘或者是网络上下载

     

     public void loadImage(Object data, ImageView imageView) {}

     

     

    BitmapWorkerTask: 异步处理图片 - 下载并绑定图片

     

    ImageCache: 图片的缓存处理,这里使用了二级缓存: 内存和磁盘。这里从类图也可以看到它有一个关联类DiskLruCache。

     

    DiskLruCache: 关于这个类网上有一些详尽的解释文章。在看这个类时切忌一开始就看代码,一定要先看类的说明,主要是journal file的格式,否则你就很难明白它的一些代码为什么那么写。这里把几个重点提一下,相信大家再看代码会容易的多

     

      1 前5行是固定(最开始是固定的5行,值是可变)

     

      2 一条记录用类Entry来描述,一条记录就是一个Entry实例, 比如 CLEAN 3400330d1dfc7f3f7f4b8d4d803dfcf6 832 21054 在程序中就是一个Entry实例

     

      3 Editor是Entry的操作器,用来读写数据

     

     

         *     libcore.io.DiskLruCache

         *     1

         *     100

         *     2

         *

         *     CLEAN 3400330d1dfc7f3f7f4b8d4d803dfcf6 832 21054

         *     DIRTY 335c4c6028171cfddfbaae1a9c313c52

         *     CLEAN 335c4c6028171cfddfbaae1a9c313c52 3934 2342

         *     REMOVE 335c4c6028171cfddfbaae1a9c313c52

         *     DIRTY 1ab96a171faeeee38496d8b330771a7a

         *     CLEAN 1ab96a171faeeee38496d8b330771a7a 1600 234

         *     READ 335c4c6028171cfddfbaae1a9c313c52

         *     READ 3400330d1dfc7f3f7f4b8d4d803dfcf6

         *

     

     

    写到这里先停一下,我们再次说明ImageWorker的功能,从内存直接加载或异步加载(从磁盘缓存或网络下载)图片。缓存的实现-ImageCache, 异步加载的实现 - BitmapWorkerTask。是不是比较清晰了。

     

     

     

    接下来继续往下看:

     

    ImageResizer:继承自ImageWorker,可能有的童鞋会问ImageWorker不是已经实现异步和缓存了吗,这个类是干嘛的呢?这个主要是根据给定的大小对Image做调整。比如当图片太大时,不能简单的加载到内存,需要做大小调整处理。

     

    这里对它的几个主要接口说明一下:

     

      setImageSize:设置图片要调整的大小

     

      calculateInSampleSize: 计算缩放比例 - 根据原图大小和要调整后的大小计算

     

      decodeSampledBitmapFrom***:得到调整大小后的图片,,这里好几个方法,数据源不一样而已,没啥大区别。

     

     

     

    ImageFetcher:继承自ImageResizer。从网络下载图片。这里要澄清一点,processBitmap在ImageWorker中是一个抽象方法,并没有实现体,在本示例中,是在ImageFetcher中实现的。之所以这样设计,是因为图片的来源是不确定和可变的,有可能从网络下载,有可能从本地数据库获取。

     

        protected abstract Bitmap processBitmap(Object data);

     

     

     最后就是在View这一层如何来使用了,从类图中可以看出,View这一层基本上操作ImageFetcher就可以了。以IamgeGridFragment为例:

     

    1 在onCreate中实例化ImageFetcher,并且添加缓存处理实例

     

     

    @Override

        public void onCreate(Bundle savedInstanceState) {

            super.onCreate(savedInstanceState);

            // The ImageFetcher takes care of loading images into our ImageView children asynchronously

            mImageFetcher = new ImageFetcher(getActivity(), mImageThumbSize);

            mImageFetcher.setLoadingImage(R.drawable.empty_photo);

            mImageFetcher.addImageCache(getActivity().getSupportFragmentManager(), cacheParams);

        }

     

    2 onCreateView中异步加载图片

     

     @Override

        public View onCreateView(

               

            mGridView.setAdapter(mAdapter);

       }      

    ImageAdapter.getView - 调用ImageFetcher.loadImage加载图片

     

    @Override

            public View getView(int position, View convertView, ViewGroup container) {

                mImageFetcher.loadImage(Images.imageThumbUrls[position - mNumColumns], imageView);

                return imageView;

            }

    3 在destroty时候关闭缓存

     

    @Override

        public void onDestroy() {

            super.onDestroy();

            mImageFetcher.closeCache();



© 著作权归作者所有

共有 人打赏支持
今日竹石
粉丝 41
博文 227
码字总数 181312
作品 0
朝阳
程序员
我使用fragment+viewpager组合,结合bitmapfun

我使用fragment+viewpager组合,结合bitmapfun用来做图片缓存的东西,fragment页面内容是一个gridview,里面会有图和一些文字排版内容,总共有三项,平常bitmapfun使用结合gridview时,速度很...

Corotata
2013/07/11
1K
11
关于异步加载大量图片的问题,请指教!

@RyanHoo 你好,想跟你请教个问题:我在项目中用例google官方提供的bitmapfun,但是感觉加载速度确实很慢,看了你提供的demo,这里面数据过多那么创建的线程也就会很多,想请教一下你们项目中...

furan
2013/08/15
103
0
listView加载完美几百张图片(加载思路bitmapfun)

既上回拿出来这个项目之后我有参照着bitmapfun的思想修改了一下我的代码,之前是如果你滑动的话他会傻乎乎的把你整个都加载完之后,然后显示最后一屏,之后有听人说起bitmapfun说是google自己...

找到组织
2014/01/17
826
0
bitmapfun如何改造成能直接读SD卡上的文件

最近看到google的bitmapfun,他对图片的网络加载以及缓存做得很好,如果是要加载网络图片的话,无疑做是很好用的,但现在有个需求是,部分图片已经是以压缩包的形式下载解压放在了本地,也就...

Corotata
2013/06/22
407
1
求解 bitmapfun 显示混乱 bug

使用google 官方提供的bitmapfun异步图片加载 ,测试的时候偶然发现一个BUG,指定2个或者多个imageview显示的URL 一样的话,会显示错乱。但是如果滚动以后,在回来,显示又正常了,我只修改了...

Otherguy
2013/09/03
157
1
基于开源项目搭建属于自己的技术堆栈

在技术面试的时候肯定都会问到使用了哪些第三方框架,为什么使用它而不用其他的。身边朋友就有这样的亲身经历: 面试官:你们项目中加载图片都是用的什么框架? 面试者:Glide啊(内心窃喜)...

sinat_36668731
2017/08/31
0
0
【构建Android缓存模块】(一)吐槽与原理分析

转载声明:Ryan的博客文章欢迎您的转载,但在转载的同时,请注明文章的来源出处,不胜感激! :-) http://my.oschina.net/ryanhoo/blog/93285 摘要:在我翻译的Google官方系列教程中,Bitmap系...

RyanHoo
2012/12/01
0
9
【构建Android缓存模块】(三)Controller & 异步图片加载

转载声明:Ryan的博客文章欢迎您的转载,但在转载的同时,请注明文章的来源出处,不胜感激! :-) http://my.oschina.net/ryanhoo/blog/93432 上节课我们学习了缓存模块的实现, 缓存分做两份...

RyanHoo
2012/12/02
0
9
【Google官方教程】第四课:在UI中显示Bitmap

转载声明:Ryan的博客文章欢迎您的转载,但在转载的同时,请注明文章的来源出处,不胜感激! :-) http://my.oschina.net/ryanhoo/blog/88484 译者:Ryan Hoo 来源:https://developer.andro...

RyanHoo
2012/11/11
0
3
sharding-sphere之SQL解析insert

以mysql为例,官网说明insert语句的写法如下: 简单来讲,支持一下三种: 目前来讲,sharding-sphere并不支持第三种。原因在这里: 接下来,就以第一种为例,介绍一下整个的语法解析过程: 解析...

一滴水的坚持
06/12
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Python3学习日志二 Python中的集合set和字典dict

1.集合set 定义一个集合set 我们可以看到定义集合set有两种不同的形式,如果要定义一个空的集合set不能用{}而是要用set();另外,集合是无序的,而且set中的元素是不可重复的,如果你定义了一...

Mr_bullshit
8分钟前
0
0
adb 操作指令详解

ADB,即 Android Debug Bridge,它是 Android 开发/测试人员不可替代的强大工具,也是 Android 设备玩家的好玩具。 注:有部分命令的支持情况可能与 Android 系统版本及定制 ROM 的实现有关。...

孟飞阳
15分钟前
0
0
nodejs安装以及环境配置(很好的node安装和配置文章,少走很多弯路)

一、安装环境 1、本机系统:Windows 10 Pro(64位) 2、Node.js:v6.9.2LTS(64位) 二、安装Node.js步骤 1、下载对应你系统的Node.js版本:https://nodejs.org/en/download/ 2、选安装目录进...

sprouting
31分钟前
0
0
Redisson

了解了Redisson,发现使用挺简单的,接下来准备深入学习一下。 Redisson介绍 Redisson是架设于Redis基础之上的一个Java驻内存数据网格(In-Memory Data Grid) Redisson在基于NIO的Netty框架上...

to_ln
32分钟前
0
0
python有哪些好玩的应用实现,用python爬虫做一个二维码生成器

python爬虫不止可以批量下载数据,还可以有很多有趣的应用,之前也发过很多,比如天气预报实时查询、cmd版的实时翻译、快速浏览论坛热门帖等等,这些都可以算是爬虫的另一个应用方向! 今天给...

python玩家
32分钟前
0
0
jq 判断复选框是否被选中,复选框后台接收

1. 效果 2. 代码 html部分: JS部分: var rememberLogin = $("#rememberLoginId").is(':checked')//获取复选框是否被选中 var rememberLoginval = $("#rememberLoginId").attr('value')//拿......

Lucky_Me
39分钟前
0
0
python爬虫日志(3)-爬去异步加载网页

在浏览器检查元素页面中,选取Network中的XHR选项即可观察每次加载页面,网页发出的请求,观察url的规律即可利用封装的函数对每一页进行爬取。

茫羽行
39分钟前
0
0
《趣谈网络协议》01之为什么要学习网络协议?

一、协议 1.协议的定义 简单说协议就是一个规则,保证沟通交流双方可以互相听懂、理解或者可以双方合作可以顺利进行的一个约定和规则。 2.生活中例子 (1)有一种叫“程序猿”的物种,敲着一种...

aibinxiao
41分钟前
1
0
Python数据分析numpy基础-维度的认识

什么是多维数组? 核心对象是同型的多维数组(简单理解就是一个表格,通常内容都是些数字),具有相同的数据类型。 概念: 1. axes(轴):数组的维度统称为轴。 2. rank:轴的数量称为rank。...

十年磨一剑3344
45分钟前
0
0
Java 正则表达式相关资料

1.java正则表达式过滤html标签

IT追寻者
49分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部