大图片加载的处理策略

  首先这是我第一次发表文章和第一次在网上写文章,写的不好的请见谅。因为我也经常看别人写的博客,所以我觉得在开发中将一些自己学到的记录起来是很好的,别人能学习的到而我自己也能回顾,。接下来就不罗嗦啦,直入我们今天要写的主题中。

接下来我要讲的是我们平时在安卓开发中或者面试中会用到的,大图片加载的处理策略,其实大图片的处理策略有两个核心的API,这里我们以Volley框架加载图片作为例子,贴上核心代码先:

上面的代码我们运行一下我们会发现,图片加载不成功,看一下Log,这里报了一行错误:

这里其实报了一个OOM的错误,内存溢出,没错,加载大图的时候内存空间不够会导致内存溢出,。接下来我们把上面的其中两个参数改一下:

ImageRequest(String url, Response.Listener listener,intmaxWidth,intmaxHeight,

ScaleType scaleType, Config decodeConfig, Response.ErrorListener errorListener);

我们把上面的测试的代码中intmaxWidth,intmaxHeight,这两个属性改为100和100,测试结果如下:

这时我们发现图片加载出来了,这是为什么呢?接下来我们跟踪下源码。

其实Volley在加载图片的时候底层会走一个方法:

这个方法在IamgeRequest中,其实真正请求网络加载图片的时候会执行这个方法,我们也看到其实这个方法是执行一个网络请求,这里也看到我们刚才所报的错误,就是从这里来的,接下来我们继续跟踪一下‘doParse()这个方法:

这里我们关注一行判断: if(mMaxWidth==0&&mMaxHeight==0),我们之前把这些值设置为0,0的时候,就会执行到里面的方法,所以才会报出OOM,那么当我们设置为100,100的时候呢,为什么图片可以加载成功呢,我们对比一下下面的代码可以知道:其实真是多了一个这样子的属性:  

这个InJustDecodeBounds参数有什么作用呢?我们毫不客气的点进去看下官方的注释:

其实官方英文的解释是这样的意思:如果这个值设置为true的话,将会返回一个null,其实也就是会返回一个空的bitmap,但是out属性会被赋值,可以获取到这张图片的宽和高,系统不会为这个Bitmap分配内存。

通过这里我们原来大图片缓存策略之一是要设置这个BitmapFactory.inJustDecodeounds的值为true,我们接着看代码:

这里我们看到关注底下有一行代码:decodeOptions.inSampleSize = findBestSampleSize(....);

这个inSampleSize有什么作用呢,我们接下里继续点进去看一下:

看到这一大段英文是不是头晕?不用怕,大概看得懂就行了,SampleSize是采样率的意思,其实官方想表达的意思是,当这个值大于1的时候。。。。。。。。。。中间省略,自己有道,然后举个例子,inSampleSize == 4这个值设置为4的时候,,会返回1/4之一宽和高的图片,也是就是图片会缩放到原来的1/16大小。当这个值小于1的时候他会赋值为1,解码器解码的时候会四舍五入到2的平方,也就是1/4之一。建议设置为2这个值。

然后解释一下这行代码的作用:

这里通过一个方法将我们之前设置的宽和高,和设置了InJustDecodeBounds == true之后得到的out属性的宽和高,通过一些算法得到压缩过后的采样率。值得一提的是,每个图片加载框架的算法都不同,但核心点都是一样的,这里不过多解释。

最后总结一下:

inJustDecodeBounds: 开关,设置为true的时候,bitmap为null,但是out属性会被赋值,可以获取到这张图片的宽和高,系统不会为这个bitmap分配内存。

通过BitmapFactory的一个inJustDecodeounds获取到图片的out属性:宽和高,但是不会为这张图片分配内存。

BitmapFactory.inSampleSize(采样率)如果设置的值大于1,假如设置为4,宽和高都缩小4分之1,也就是整体缩小16分之1;

大图片的加载核心其实就是两个API,一个是设置bitmap的采样率inSampleSize,设置采样率要获取原图片的宽和高属性,如果直接获取,会加载到内存中,会导致OOM,所以我们需要先设置一个开关,inJustDecodeounds,设置这个值为true,开启bitmap的out属性,获取到宽和高,当时bitmap不会加载到内存中。返回bitmap为空。


到这里,我的博文就结束啦,希望能对你有所帮助,接下来我也会慢慢的更新自己所学到的Android技术,大家共勉之。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,835评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,598评论 1 295
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,569评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,159评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,533评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,710评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,923评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,674评论 0 203
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,421评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,622评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,115评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,428评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,114评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,097评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,875评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,753评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,649评论 2 271

推荐阅读更多精彩内容