Latest Posts

Fresco源代码分析之二:SimpleDraweeView如何拉取图片并绘制在屏幕上?

fresco-og-image

Fresco源代码分析之二:SimpleDraweeView如何拉取图片并绘制在屏幕上?

引言

《Fresco源代码分析之1:Fresco的初始化 》文章中,仔细分析了Fresco.init(Context)方法中所做的工作。总结下来有一下几点:

  1. 初始化了 ImagePipelineFactory , 包括默认的ImagePipelineConfig(其中初始化了各种线程池、是否解码、旋转之类的设置、各种Cache的默认配置等等)。
  2. 初始化了默认的 SimpleDraweeView ,包括对应的ImagePipeline。

那么问题来了,当我们通过SimpleDraweeView的

方法调用的时候,Fresco到底做了哪些工作呢?图片是经过了哪些工作绘制在界面上的呢?这篇文章就来说说这些事情。

调用方法

在想象中,图片[……]

Read more

Fresco源代码分析:1、Fresco的初始化

fresco-og-image

Fresco源代码分析 之一 默认初始化

Fresco被认为是现在最为好用的Android图片加载库,在之前的文章,有根据官方文档分析过Fresco的入门手册,但使用始终无法明白其具体是怎么样工作的,因为,我们还是要从源码上分析Fresco的工作原理。

Fresco的初始化

在一般情况下,我们是使用默认的ImagePipeline配置来初始化Fresco的,代码如下:

而实际上,Fresco一共提供了两个初始化方法

可以看到,这两个初始化方法仅仅是初始化ImagePipeline的不同,接下来依次分析。

初始化ImagePipelineFactory

同样的,ImagePipelineFactory总共提供了两个初始化方法,代码分别如下:

其中可以看到initialize[……]

Read more

Fresco学习笔记

Fresco学习笔记

Fresco是Facebook出品的一款比较新的图片库,相比 Volley 或者 Picasso 具有很多优点,这篇文章主要是记录如何学习使用Fresco。 内容主要来自: http://fresco-cn.org/docs/getting-started.html

 

配置和使用

引用

Gradle添加lib

使用

网络权限

初始化Fresco

注意,初始化Fresco的代码必须位于setContentView(ResourceId)代码调用之前。

xml布局文件命名空间

使用SimpleDraweeView

[crayon-57c1ab549784e3435[……]

Read more

EventBus源代码解析:2、消息的发布与处理

在上一篇文章《EventBus源代码解析:1、初始化与订阅者注册》当中,我们主要分析了两个事情:

  • EventBus初始化
  • 订阅者的注册

我们通过分析,EventBus在初始化的时候,初始化了几个集合,分别用来根据EventType和Event Handler所在的类索引对应的Handler方法;并且也同时初始化了用于不同ThreadMode的Poster。订阅者在注册的时候,EventBus会解析要注册的类,分析其所有的方法,从中找出Event的Handler方法(即public修饰的以onEvent开头),然后根据EventType保存到相应的List中。

但我们一直没有分析到一个分析,那就是,EventBus到底是如何去Post消息的呢?接下来我们就去分析这个问题。按照我们的老套路,还是从最常用的代码入手:

这个代码主要分为两步,第一步是构建了一个需要处理的Event即MessageEven[……]

Read more

EventBus源代码解析:1、初始化与订阅者注册

和以前一样,我们同样从我们最经常使用的代码入手,分析EventBus到底是如何进行工作的。所以,第一步,我们先分析EventBus的初始化代码,看看初始化代码当中,都做了哪些工作?
一:初始化
单例模式

首先,我们最经常使用的EventBus的默认配置,其实就是一个我们常用的单例模式:

  • 首先尝试获取defaultInstance,如果defaultInstance为null,说明默认的EventBus还没有初始化,因此接下来的工作就是需要对EventBus进行初始化。
  • 此时,为了同一个时刻只有一个EventBus在初始化,也是为了避免多个线程同时访问的时候,各自生成了不同的EventBus对象,因此我们需要对初始化的代码块进行同步。当然同步的范围选择很重要,同步的范围必须是所有的线程都能够同时看到,因此选用了EventBus的类对象作为同步代码块的同步对象。
  • 此时,由于进入到同步代码块之后,可能是由[……]

Read more