图片加载框架的选择问题(Fresco,Glide,Picasso,UIL)

确实这四个都非常强大,且大部分帖子文档都对这些框架有很深入的介绍。所以今天来讲一点不一样的。


首先,说说需求。需求有两点,一是列表icon。二是点击列表进入详情后展示详情图片,如下图:


看样子是很简单的需求,但是做到后期还是会有问题的。

1.ImageLoader:

之前我们是用的ImageLoader做的图片,但是由于这个框架相对较老,一直也想更换。而且会有个问题,在每次加载网络图片的时候,同一个URL,imageloader都会请求两次网络,拉两次图,给用户造成流量损失,同时损失掉了app的性能。

2.Fresco:

后来换成了Fresco,一切看起来都是那么的完美,在详情页我们前三张图片会显示5次(产品需求,轮播图一次,分享时生成的图片一次,详情页下方一次,点击图片跳转到查看大图一次,查看大图页面列表一次共5次)。虽然我们也可以先将图片下载后拿到Bitmap然后放到各个位置进行展示,但是那么做实在是太low了

而使用Fresco你只需要在需要的位置进行下载图片即可,Fresco会自动复用相同URL的缓存,即使两个相同URL同时进行请求也无所谓,Fresco只会进行一次网络请求,然后第二个进行复用。这对我们的产品来说非常重要。毕竟如果一张图片请求5次,用户可能就报警了。

然而,Fresco还有个隐藏问题,那就是最大限制,也就是Fresco的384问题。这个问题提出的人并不多,主要表现在,以列表为例(我们的产品可以进行页面递归,也会出现这个问题)列表持续向下滑动,前面还是好的。但是当滑过十几二十页以后,你会发现所有的图片都显示不出来了。没错是所有,而且抓包显示所有的图片都是请求成功的。也就是说Fresco不将图片进行展示。而且如果使用Fresco的图片下载监听,你会发现下载图片时会报一个异常,一个并不引起任何问题的异常,叫做 TooManyBitmapsException()。这个异常你无法从log中查到,且不影响app使用,只是图片无法显示。如果想获取异常只有从图片下载监听中获取。然后我们追源码会发现,在Fresco的imagepipeline包下会有一个BitmapCounter类,这个类中是会报这个异常的。


那么这个!increase(bitmap)又是什么条件呢?

public synchronized boolean increase(Bitmap bitmap) {
    final int bitmapSize = BitmapUtil.getSizeInBytes(bitmap);
    if (mCount >= mMaxCount || mSize + bitmapSize > mMaxSize) {
      return false;
    }
    mCount++;
    mSize += bitmapSize;
    return true;
  }

这里面的mMaxCount 和mMaxSize 都是从构造函数中传进来的。而它的调用者,将这两个数值写死了(mMaxSize根据手机内存设定,但是我们无法进行动态改变,所以在这里称为写死。mMaxCount则是上面说的384问题中的384)



所以说,当Fresco加载384张图片以后,就无法显示出图片了。当然如果当前activity进行销毁以后这个数值是会释放的。但是列表页300多个数据也不是很多,而且涉及到递归页面的话,300多张图片很明显是不够的,且无法在代码中进行动态设置。因此,Fresco被Pass掉了。


3.Glide:

这个框架是很多人推荐的,拿来用,确实解决了上面所说的384问题,但是在详情页的时候出现了问题,那就是相同URL的不同控件之间无法复用缓存,后来查资料说需要设定所有的图片缓存都使用原图大小缓存,这样就只保留一份,但是在不同控件同时请求同一个URL的时候,还是会请求多次网络。所以说最后这个问题还是没有解决。因此,PASS。


4.Picasso:

完美的解决了以上所有问题。看很多人都说Picasso效率上来讲并不如Glide。但是至少解决了目前我的问题。所以现在项目中使用的就是它了。滑动列表页也没觉得有多么卡。


5.ImageLoader:

最开始使用是因为我代码中一次网络请求会请求服务器两次,所以把它换掉了。虽然听说这个问题可以通过设置进行处理,但是也确实是因为这个框架比较久远,所以没有进行深入研究。如果最后Picasso没有解决问题,我想我应该还是会回来研究一下吧。。。


就这样。最后,总结一下:

Fresco加载图片过多会导致图片无法显示,

Glide两个控件同时请求同一个URL,网络请求是两次,

Imageloader一次加载图片也会请求两次URL,不知道是不是设置的问题,

Picasso完美的解决了以上所有问题。虽然这个框架逐渐被Fresco和Glide代替了(大家都这么说···)


最后,这次出的这个问题都挺奇葩的。这些框架相对来说都很成熟,理论上不应该会出现这些问题。所以我怀疑是我自己项目中设置的不对,如果有解决了以上问题的童靴和朋友,欢迎留言告诉我下,感激不尽。


测试环境:

测试机:华为荣耀4C

Fresco:1.3.0

Glide: 3.7.0

Picasso:2.5.2

Imageloader:1.9.5


如果你能看到这里,那就再次感谢看我废话了这么多^_^。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值