黑马程序员技术交流社区

标题: 【郑州校区】Picasso源码解析 一 [打印本页]

作者: 我是楠楠    时间: 2017-8-17 16:46
标题: 【郑州校区】Picasso源码解析 一
本帖最后由 我是楠楠 于 2017-8-17 16:49 编辑

      前面写的5篇文章让我们对Picasso的用法有了很详细的了解,Android的框架层出不穷,每年都会开源出大量的优秀的框架,如果我们只是站在一个使用者的角度去不断的接触框架,而不去学习框架底层的实现原理,那样顶多也只能一直当新手,而不是老司机了,下面我们就从最基本的入手,从源码的角度去剖析Picasso的工作原理(该分析都是基于Picasso 2.5.2版本).Let’s Go.  

        官方给出的一个最简单的用法,一个链式调用就能实现一张图片的请求及展示:



复制代码

        只需这一行代码,Picasso就能从我们提供的URL地址中去请求图片,然后将图片展示到targetImageView中,我们就从最简单的开始,一层层的还原Picasso最底层的本质.


Picasso.with(context)

复制代码

这段代码就是为了初始化Picasso,获取一个Picasso的实例,该类代码具有很大的共性,很多框架在获取实例时基本都是采用了 单例模式+建造者模式



复制代码

在该方法中主要对初始化了以下参数:



复制代码

      上面就是关于.with(context)所做的分析,我们继续向下分析.


     .load(String url)方法源码解析

     我们现在看.load(String url)方法都做了什么操作,其实.load(url)最后调用的依然是.load(Uri uri)



复制代码

       所以加载图片的本质就是我们通过Picasso调用了load(url)返回了一个new出来的RequestCreator示例,同时将Picasso ,uri地址, 还有resourceId也就是0,作为构造参数传入,下面我们就看看该构造函数都做了哪些操作;




复制代码

  • public Builder(Uri uri) { setUri(uri); }
  • public Builder(int resourceId) { setResourceId(resourceId); }

复制代码


最重要的方法.into(target)方法解析

.into(target)方法是ReqeustCreator中的方法,所以我们去一窥究竟,其实.into(target)还是在内部调用的.into(target,callback),看代码




复制代码

下面我们就着重看一下.into(target,callback)都做了哪些操作,代码较多,我们逐一进行分析




复制代码



部分功能说明已在代码中标出,但还是用一张示意图来进行解析比较简单易懂


图画的比较丑,但是看着还算比较清晰,我们在按照代码,图示,再用文字描述一遍,让更有深的认识;

OK,到现在我们已经大致了解了Picasso.with(this).load("http://i.imgur.com/DvpvklR.png").into(target);都做了哪些操作,至于第7步之后又做了哪些操作,我们将继续分析,还原她的本质,愿大家都有美好的一天…


作者: baby14    时间: 2018-11-23 07:58
多谢分享




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2