Android源码分析
文章平均质量分 91
王世晖
呵呵哒
展开
-
Android开发Handler源码分析
Android中UI控件的访问是线程不安全的,加锁同步访问会影响性能,因此设置只能一个线程更新UI,就是主线程,或者说是UI线程。在UI线程中不能进行耗时的操作,耗时操作需要开启一个新的工作线程,工作线程不能更新UI,因此工作线程通过Handler通知UI线程更新UI原创 2016-05-19 12:48:17 · 438 阅读 · 0 评论 -
EventBus源码分析(一):入口函数提纲挈领(2.4版本)
本文是EventBus源码分析的第一篇文章,不拘泥于具体的实现细节,从宏观上把握EventBus的设计思路,而EventBus总体的设计思路为: EventBus实例保存了事件到订阅者列表的map,发布事件的时候,从该map中取出该事件的所有订阅者,在规定的线程中反射调用所有订阅者的事件处理方法。DCL单例创建EventBus对象EventBus提供了静态方法创建EventBus对象,实现方式为标原创 2016-07-01 15:58:42 · 1227 阅读 · 0 评论 -
EventBus源码分析(三):post方法发布事件【获取事件的所有订阅者,反射调用订阅者事件处理方法】(2.4版本)
EventBus维护了一个重要的HashMap,这个HashMap的键是事件,值是该事件的订阅者列表,因此post事件的时候就能够从此HashMap中取出事件的订阅者列表,对每个订阅者反射调用事件处理方法。 private final Map<Class<?>, CopyOnWriteArrayList<Subscription>> subscriptionsByEventType;post方原创 2016-07-04 15:20:03 · 2823 阅读 · 0 评论 -
EventBus源码分析(四):线程模型分析(2.4版本)
EventBus有四种线程模型PostThread模式不需线程切换,直接在发布者线程进行事件处理。MainThread模式分类讨论:发布者线程是主线程则直接调用事件处理方法,否则通过Handler进行线程切换,切换到主线程处理事件,该模式下事件是串行执行的。BackgroundThread模式分类讨论:发布者线程不是主线程则在发布者线程直接处理事件,否则线程切换至线程池处理,所有该线程模式下的原创 2016-07-05 19:59:36 · 2262 阅读 · 0 评论 -
Picasso源码分析(一):单例模式、建造者模式、面向接口编程
Picasso简单介绍Picasso使用建造者设计模式,使异步网络加载图片到控件这一复杂流程可以用一条方法链搞定。典型的Picasso加载图片的使用方式如下:Picasso.with(context).load(url).into(imageView); 传入上下文context构造获取Picasso然后异步加载图片链接获取图片最后显示在控件上,一气呵成 或者可以对加载到的图片进行尺寸压缩后再显示原创 2016-06-12 17:06:07 · 1925 阅读 · 0 评论 -
Picasso源码分析(二):默认的下载器、缓存、线程池和转换器
下载器当用户没有为Picasso指定下载器的时候Picasso会通过Utils.createDefaultDownloader(context)方法创建一个默认的下载器 static Downloader createDefaultDownloader(Context context) { try { Class.forName("com.squareup.okhttp.OkH原创 2016-06-12 22:45:55 · 4597 阅读 · 0 评论 -
Picasso源码分析(三):快照功能实现和HandlerThread的使用
HandlerThread原理和用法HandlerThread是一个Android系统提供的提供快速开发的工具类,功能为开启一个具有looper的线程,该线程的looper可以和handler绑定,也就是说创建handler的时候可以在handler构造函数传入handlerThread对象的looper,这样此handler的消息处理 方法handleMessage就会在handlerThread原创 2016-06-13 10:35:45 · 1424 阅读 · 1 评论 -
Picasso源码分析(四):不变模式、建造者模式和Request的预处理
Request的不变模式(Immutable Pattern) 不变模式可增强对象的强壮型,允许多个对象共享某一个对象,降低了对该对象进行并发访问时的同步化开销。如果需要修改一个不变对象的状态,那么就需要建立一个新的同类型对象,并在创建时将这个新的状态存储在新对象里。 不变模式只涉及到一个类。一个类的内部状态创建后,在整个生命周期都不会发生变化时,这样的类称作不变类。 不变模式的优点:原创 2016-06-14 17:06:55 · 2131 阅读 · 0 评论 -
Picasso源码分析(五):into方法追本溯源和责任链模式创建BitmapHunter
Picasso异步加载图片流程回顾首先通过with方法创建单例Picasso对象 public static Picasso with(Context context) { if (singleton == null) { synchronized (Picasso.class) { if (singleton == null) { sing原创 2016-06-21 16:58:14 · 4746 阅读 · 1 评论 -
EventBus源码分析(二):register方法保存事件的订阅者列表(2.4版本)
EventBus维护了两个重要的map:事件到订阅者列表的map,发布事件的时候可以根据事件获取订阅者列表,这样可以逐一反射调用订阅者的事件处理方法。订阅者到事件列表的map,这样订阅者向EventBus解除注册(unregister)的时候可以根据订阅者获取该订阅者订阅的所有事件,对每个事件分别解除注册。因此register注册订阅者的时候,EventBus会通过反射寻找订阅者订阅的所有事件原创 2016-07-04 11:11:08 · 1283 阅读 · 0 评论 -
EventBus源码解读详细注释(3)PostThread、MainThread、BackgroundThread、Async四种线程模式的区别
PostThread:直接在发布者线程里边调用事件处理方法MainThread:如果发布者线程是主线程,那么直接在发布者线程(主线程)里边调用事件处理方法;如果发布者线程不是主线程,就把此事件送到主线程消息循环处理队列,在主线程中调用事件处理BackgroundThread:如果发布者线程是主线程,那么把此事件发送到一个专门处理后台线程的消息循环处理队列,该队列管理多个后台线程;如原创 2016-03-20 11:31:40 · 4605 阅读 · 0 评论 -
Android开发AsyncTask源码分析【模板方法模式】
模板方法定义了一个算法的框架,将框架中一些步骤延迟到子类中实现,使子类可以不修改一个算法的框架结构就可以重定义框架的某些步骤。模板方法实际上市封装一个固定的流程,流程的步骤在抽象类中已经定义好了,子类可以有不同的算法实现,这样就可以在框架流程不修改的情况下实现某下算法的替换AsyncTask的模板方法使用AsyncTask,只要构造AsyncTask对象,然后调用execute方法即可。原创 2016-05-19 21:07:53 · 468 阅读 · 0 评论 -
Android开发Message源码分析【享元模式|对象池】
享元模式是对象池的一种实现,尽可能减少内存的使用,使用缓存来共享可用的对象,避免创建过多的对象。Android中Message使用的设计模式就是享元模式,获取Message通过obtain方法从对象池获取,Message使用结束通过recycle将Message归还给对象池,达到循环利用对象,避免重复创建的目的原创 2016-05-19 14:54:21 · 1378 阅读 · 2 评论 -
Volley源码分析【面向接口编程的典范】
基本原理Volley采用生产者消费者模型,生产者(Volley的使用者)通过调用add方法给请求队列添加请求,缓存调度器和网络调度器作为消费者从请求队列取出请求处理,根据不同情况决定走缓存还是走网络请求数据,最后切换线程,将请求的数据回调给UI线程。创建请求队列Volley通过静态工厂方法newRequestQueue生成一个请求队列RequestQueue public static Req原创 2016-06-03 16:28:08 · 4010 阅读 · 0 评论 -
EventBus源码解读详细注释(2)MainThread线程模型分析
EventBus的线程模型为何要定义事件模型?因为在Android的中线程的使用有以下的限制:1 主线程不能被阻塞,UI的更新位于主线程,耗时操作如网络处理在后台线程 2 事件的发送和处理可能会位于不同线程通过使用EvenBus的线程模型,我们可以定义处理事件的线程类型。EventBus中有四种线程模型:PostThread,MainThread,Backgroun原创 2016-03-20 00:25:09 · 1679 阅读 · 0 评论 -
EventBus源码解读详细注释(4)register时刷新的两个map
EventBus中有两个重要的map,一个是事件到订阅者列表的map,另一个是订阅者到事件列表的map,每次register的时候都要动态刷新这两个map的数据。正是因为有了这两个map,EventBus在post事件的时候才可以根据事件类型找到所有订阅了此事件的订阅者,然后使用反射调用订阅者的事件处理方法。先看看EventBus中这两个map是如何定义的/*事件到订阅者列表的map,原创 2016-03-20 21:09:10 · 1057 阅读 · 0 评论 -
EventBus源码解读详细注释(5)事件消息继承性分析 eventInheritance含义
如果post(A),A extends B implements C,D implements C那么onEvent(A)、onEvent(B)、onEvent(C)、onEvent(D)四个事件处理方法那些能得到调用呢答案是onEvent(A)、onEvent(B)、onEvent(C)这三个先用简单的实验验证,然后源码分析写一个简单的Activity测试public c原创 2016-03-21 15:52:37 · 1995 阅读 · 1 评论 -
EventBus源码解读详细注释(6)从事件发布到事件处理,究竟发生了什么!
EventBus内部存储了事件到此事件所有订阅者的map,因此post事件的时候,可以找到订阅了此事件的所有订阅者,然后根据订阅者对此事件的线程模型,在对应的线程里边,通过反射调用事件处理函数。先看EventBus里边两个重要的map/*下边的两个map的数据都是各个线程都可以访问的,因此访问的时候要对这两个map加锁*//*事件到订阅者列表的map,key是事件,也就是消息处理方法原创 2016-03-21 20:45:18 · 772 阅读 · 0 评论 -
EventBus源码解读详细注释(1)register的幕后黑手
register(this)就是去当前类,遍历所有的方法,按照事件处理方法的命名规则约束(onEvent开头,只有一个参数,非static,非abstract的public方法)过滤出事件处理方法然后进行存储。然后循环遍历当前类的父类,做同样的处理。通过阅读源代码发现如果子类没有覆写父类的事件处理方法,那么父类的事件处理方法将会加入事件处理方法列表。 private synchronize原创 2016-03-17 16:32:50 · 1154 阅读 · 0 评论 -
Picasso源码分析(六):BitmapHunter与请求结果的处理
into方法流程回顾into方法首先检查了是否在主线程,控件是否为null,用户有没有设置uri或者资源id,是否调用了fit方法自适应压缩。接着根据into方法调用时间创建Request请求,并为该请求设置缓存用的key。接着判断是否要读内存缓存,可以读内存缓存并且命中的话就将缓存中的图片显示在控件然后返回,否则开启网络请求。网络请求的过程中暂时显示占位图。 网络请求的过程就是针对此次请求封装成原创 2016-06-22 16:30:48 · 1737 阅读 · 1 评论