Android

Android图片框架对比

2020-07-28  本文已影响0人  momxmo

一、目的:

对比现在主流图片框架的优势和缺点,在实际项目中如何选择适合自己的框架;

主流框架

Glide、Fresco、Picasso、ImageLoader
共同优点:

简单对比
框架 Glide Fresco Picasso ImageLoader
创建时间 2012 2015 2013 2011(已停止维护)
作者 Google员工开源项目 FaceBook开源项目 Square开源项目 nostra13
默认图片格式 RGB_565 ARGB_8888 ARGB_8888 ARGB_8888
支持图片格式 支持Gif、WebP 支持Gif、WebP 不支持Gif、WebP 不支持Gif、WebP
支持Acitivity、Fragment生命周期 支持 不支持 不支持 不支持
OOM 特大图 在5.0以下系统,Bitmap缓存位于ashmem(下面有介绍),这样Bitmap对象的创建和释放将不会引发GC,更少的GC会使你的App运行得更加流畅。5.0及其以上系统,相比之下,内存管理有了很大的改进,所以Bitmap缓存直接位于Java的heap(下面有介绍)上 特大图 低端手机、特大图
包大小 474K 16.8M 120k 162k
总结 使用大部分App,对图片要求不高,不需要高清原图可以考虑使用 对图片要求高,需要高清原图,建议使用 没有Glide支持和扩展好 不建议使用(已停止维护)

以上名词介绍

Java Heap(Dalvik Heap):这部分的内存区域是由Dalvik虚拟机管理,通过Java中 new 关键字来申请一块新内存。这块区域的内存是由GC直接管理,能够自动回收内存。这块内存的大小会受到系统限制,当内存超过APP最大可用内存时会OOM

Native Heap:这部分内存区域是在C++中申请的,它不受限于APP的最大可用内存限制,而只是受限于设备的物理可用内存限制。它的缺点在于没有自动回收机制,只能通过C++语法来释放申请的内存

Ashmem(Android匿名共享内存):这部分内存类似于Native内存区,但是它是受Android系统底层管理的,当Android系统内存不足时,会回收Ashmem区域中状态是 unpin 的对象内存块,如果不希望对象被回收,可以通过 pin 来保护一个对象

以上介绍参考这篇文章https://www.cnblogs.com/wytiger/p/5690039.html

二、基本概念

在分析他们的差异、优缺点之前,我们先了解图片缓存通用的概念:

以上概念在不同框架之间可能不同,比如Displayer在ImageLoader中叫做ImageAware,在Picasso和Glide中叫做Target。

三、设计分析

3.1 Glide

Glide 设计及优点
Glide设计及流程

以上为Glide的总体设计图。
整个库分为RequestManager(请求管理器)、Engine(数据获取引擎)、Fetcher(数据获取器)、MemoryCache(内存缓存)、DiskLRUCache(本地缓存)、Transformation(图片处理)、Encoder(编码处理)、Registry(图片类型以及解析器配置)、Target(目标)等模块。

简单流程:Glider收到加载及显示资源任务,创建Request并将它交给RequestManager,Request启动Engine去数据源获取资源,得到资源后通过Transformation处理后交给Target.
Glide依赖DiskLRUCache、GifDecoder等开源库去完成本地缓存和Gif图片解密工作;

Glide核心

为Bitmap 维护一个BitmapPool对象池, 对象池的主要目的是通过减少大对象的分配以重用来提高性能!

Glide优点

缺点
①图片质量低:因为机制不同,速度快,但是图片的质量降低了RGB565;
②多尺寸缓存导致内存和磁盘占用多:根据ImageView大小来缓存,可能会导致一张图片可能根据展示情况来缓存不同尺寸的几份;

扩展理解参考:https://www.jianshu.com/p/1ab5597af607

3.2 Picasso

Picasso 设计及优点

Picasso设计及流程

以上为Picasso的总体设计图。
整个库分为Dispatcher、RequestHandler以及Downloader、PicassoDrawable等模块。
简单流程:Picasso收到加载显示图片任务后,创建Request并将它交给Dispatcher,Dispatcher分发任务到具体RequestHandler,任务通过MemoryCache及Handler(数据获取接口)获取图片,图片获取成功后通过PicassoDrawable显示到Target中;

上面Data的File system部分,Picasso没有自定义本地缓存的接口,默认使用http的本地缓存,API19以上使用okhttp,一下使用UrlConnection,所以如果需要自定义本地缓存就需要自定义Downloader;

Picasso优点

缺点:加载速度没有其他框架快;
特点:只缓存一个全尺寸的图片,根据需求的大小在压缩转换;

3.2 Fresco

Picasso设计及流程

Fresco设计及流程

以上为Fresco的总体设计图
整个库分为UI:DraweeView(View控件)、Drawable(图片数据)、DraweeController(图片控制器)、DraweeHiierarchy(图片体系);Core:DataSource(数据源)、ImagePipeline(图像管道)、Producer(生产者)、ProducerFacotry(生产工厂)、Subcriber(订阅)、Supplier(供应者)、Consumer(消费者);IO/Data:MemoryCache(内存缓存)、Network、DiskCache(磁盘缓存)、Recourse(本地资源)

简单流程:从上面的结构可以看出,fresco主要采用了工厂+建造者的模式实现功能,逻辑划分比较清楚;Fresco框架整体是一个MVC模式,DrawableView--->View用来显示顶层视图、DrawableController--->Control控制加载图片的配置 事件的分发、DrawableHierarchy--->Model 用于存储和描述图片信息,同时也封装了一些图片的显示和视图层级的方法;ImagePipeline模块负责从网络、本地文件系统、本地资源加载图片

Fresco优点

缺点:
①框架大,影响Apk体积;
②一定的学习成本,使用比较繁琐,需要使用内部提供的ImageView控件,使用起来比较复杂;

上一篇 下一篇

猜你喜欢

热点阅读