关闭 x
IT技术网
    技 采 号
    ITJS.cn - 技术改变世界
    • 实用工具
    • 菜鸟教程
    IT采购网 中国存储网 科技号 CIO智库

    IT技术网

    IT采购网
    • 首页
    • 行业资讯
    • 系统运维
      • 操作系统
        • Windows
        • Linux
        • Mac OS
      • 数据库
        • MySQL
        • Oracle
        • SQL Server
      • 网站建设
    • 人工智能
    • 半导体芯片
    • 笔记本电脑
    • 智能手机
    • 智能汽车
    • 编程语言
    IT技术网 - ITJS.CN
    首页 » 安卓开发 »Android图片加载库Picasso源码分析

    Android图片加载库Picasso源码分析

    2016-01-13 00:00:00 出处:InfoQ - 张龙
    分享

    图片加载在Android开发中是非常重要,好的图片加载库也比比皆是。ImageLoader、Picasso、Glide、Fresco均是优秀的图片加载库。

    以上提到的几种图片加载库各有特色。用法与比较,网上已经很多了。

    出于学习的角度,个人认为从Picasso入手较好。代码量小,同时API优美,很适合我们学习。

    今天笔者就Picasso的源码进行分析,抛出一些图片加载的技术细节供园友参考。

    PS:建议园友先大致看一下源码。

    我们对图片加载的要求

    1.加载速度要快

    2.资源消耗要低

    3.加载图片不能错位

    Picasso是否满足要求?

    加载速度要快

    1.标配策略,MemoryCache+DiskCache+Net。提高加载速度,同时保证流量。

    2.Net部分,兼顾单请求加载速度与多请求并发能力,从而提高整体加载速度。

    3.MemoryCache部分,通过Lru策略提高缓存效率。

    资源消耗要低

    1.渲染适当尺寸图片来减少内存。

    2.通过线程池来限制并发的图片加载线程,降低资源消耗。

    3.请求相同图片的线程要合并,减少线程数。

    加载图片不能错位

    Adapterview会 复用 View,Picasso通过Map<ImageView,Action>机制保证View展示正确的图。

    可见,Picasso已经满足了我们对图片加载的需求。

    Picasso的一些基本策略

    缓存策略?MemoryCache+DiskCache+Net

    1.MemoryCache采用的是Lru策略,持有一定数量处理过的图(譬如经过resize/rotate处理,可直接设置到view中)。

    2.DiskCache是网络图片在本地的缓存,缓存的是原图,可能需要经过处理才能设置到view中。

    3.Net是图片服务器,当MemoryCache和DiskCache均取不到图片时,网络拉取,成本最高。

    图片错位

    为了保证图片不会错位,Picasso维护了Map<ImageView,Action>,每个ImageView均只对应一个Action。

    若获取的图片Action与ImageView不符合,则丢弃,等待正确的Action执行完。

    性能

    1.Picasso的线程池是优化过的,根据当前设备网络状况设置ThreadCount。

    在网络良好的条件下,线程池持有较多线程,保证下载速度够快。在网络较差的条件下(2G网络等),线程池减少持有线程,保证带宽不会被多个连接阻塞。

    2.Picasso将图片uri、resize、transform等参数糅合为key,将key封装到Action中进行请求。

    请求线程Hunter对相同key的Action进行合并,请求完成后,Action依次得到图片。

    以上是Picasso的一些基本策略,可能看不太懂,接下来结合 Picasso加载ImageView图片的场景 来串一下流程。

    流程与源码分析

    实例化

    picasso的实例化有两种方式

    1.Picasso.with(context)

    此方法提供默认方式,生成单例的Picasso对象。

    2.new Picasso.Builder(context).build()

    此方式提供自定义线程池、缓存、下载器等方法。

    获取RequestCreator

    picasso作为图片加载库,作用便是下载图片。我们拿到picasso实例后,正常思路便是调用picasso.load()。

    load()有四个方法,参数各不相同,不过可以分为两类:uri和resourceId。uri又分为file和net。

    load()的返回结果是RequestCreator对象,RequestCreator是用来配置加载参数的。

    RequestCreator

    RequestCreator有两个功能

    1.配置加载参数。

    包括placeHolder与error图片,加载图片的大小、旋转、居中等属性。

    2.执行加载。

    通过调用into(object)方法进行加载。

    into方法主流程梳理如下

    Android图片加载库Picasso源码分析

    后续的工作就交由Hunter来处理了

    备注1:(imageview,action)是用来保证imageview与正确action匹配的。

    备注2:hunterMap通过key持有多个hunter,同一个hunter可以对应多个action

    Hunter

    hunter是一个Runnable,作用是获取图片。

    hunter的执行流程:在run()方法中执行hunt()方法尝试获取图片,结果(成功、失败、异常)交给Dispatcher回调。

    hunter的基础类是BitmapHunter,但它却是一个模版类,最重要的decode(request)方法交由子类来实现。

    hunt()方法主流程梳理如下:

    Android图片加载库Picasso源码分析

    Dispatcher

    Dispatcher是分发器,由Picasso或Hunter来调用。

    Picasso或BitmapHunter只能调用dispatcher**()方法。

    原因是不能确定是main线程或Hunter线程在调用,所以Dispatcher索性对所有的调用均经过Dispatcher转发,转发后调用perform**()方法,这样即可保证在main线程中操作事件。

    API如下:

    dispatcherSubmit()和dispatcherCancel()

    hunter中加入action便调用dispatcherSubmit(),hunter中取消action便调用dispatcherCancel()

    dispatcherComplete()和dispatcherError()

    加载结束时调用。均调用batch方法,不过complete操作会将bitmap加入到cache中,以便后续调用。

    batch()

    起缓冲作用,每隔0.2s执行一次performBatchComplete()批处理。批处理将hunterList回调给Picasso,Picasso对每个hunter的每个action进行结果回调。

    其他

    跟随ImageView的图片加载,应该对Picasso的源码已经有了一定了解。但是还有几个相对独立的模块没有涉及到,园友们直接阅读源码即可。

    downloader提供了UrlConnection和OKHttp两种方案,优先选用OKHttp。主要添加了httpCache。

    Stats主要用于数据统计,很独立的模块。

    上一篇返回首页 下一篇

    声明: 此文观点不代表本站立场;转载务必保留本文链接;版权疑问请联系我们。

    别人在看

    正版 Windows 11产品密钥怎么查找/查看?

    还有3个月,微软将停止 Windows 10 的更新

    Windows 10 终止支持后,企业为何要立即升级?

    Windows 10 将于 2025年10 月终止技术支持,建议迁移到 Windows 11

    Windows 12 发布推迟,微软正全力筹备Windows 11 25H2更新

    Linux 退出 mail的命令是什么

    Linux 提醒 No space left on device,但我的空间看起来还有不少空余呢

    hiberfil.sys文件可以删除吗?了解该文件并手把手教你删除C盘的hiberfil.sys文件

    Window 10和 Windows 11哪个好?答案是:看你自己的需求

    盗版软件成公司里的“隐形炸弹”?老板们的“法务噩梦” 有救了!

    IT头条

    公安部:我国在售汽车搭载的“智驾”系统都不具备“自动驾驶”功能

    02:03

    液冷服务器概念股走强,博汇、润泽等液冷概念股票大涨

    01:17

    亚太地区的 AI 驱动型医疗保健:2025 年及以后的下一步是什么?

    16:30

    智能手机市场风云:iPhone领跑销量榜,华为缺席引争议

    15:43

    大数据算法和“老师傅”经验叠加 智慧化收储粮食尽显“科技范”

    15:17

    技术热点

    SQL汉字转换为拼音的函数

    windows 7系统无法运行Photoshop CS3的解决方法

    巧用MySQL加密函数对Web网站敏感数据进行保护

    MySQL基础知识简介

    Windows7和WinXP下如何实现不输密码自动登录系统的设置方法介绍

    windows 7系统ip地址冲突怎么办?windows 7系统IP地址冲突问题的

      友情链接:
    • IT采购网
    • 科技号
    • 中国存储网
    • 存储网
    • 半导体联盟
    • 医疗软件网
    • 软件中国
    • ITbrand
    • 采购中国
    • CIO智库
    • 考研题库
    • 法务网
    • AI工具网
    • 电子芯片网
    • 安全库
    • 隐私保护
    • 版权申明
    • 联系我们
    IT技术网 版权所有 © 2020-2025,京ICP备14047533号-20,Power by OK设计网

    在上方输入关键词后,回车键 开始搜索。Esc键 取消该搜索窗口。