android 学习之 EventBus 源码初析

来源:互联网 发布:bioedit软件下载 编辑:程序博客网 时间:2024/06/04 23:31

连通器原理,刚才刷厕所,想起来高中学的物理知识, 连通器可以避免管道中臭味散发出来,


sticky    粘性的,滞留的。
意思是:当接收事件的人还没有注册进来,就要发送一个事件,那么这个事件就叫做粘性事件。
      不光是事件, 广播也就这个概念, sendStickyBroadcast(Intent intent);

进程间通信
   Activity
   BroadcastReceiver
   ContentProvider
    aidl
   Messager   使用AIDL完成


线程间通信  
    Handler    主线程到子线程, 子线程到子线程 (Android 学习之 Handler)
   EventBus
   使用观察者模式,接口  (观察模式事例: ListViewAdapter )

EventBus 是基于发布/订阅模式的事件总线。网上都在说它是发布/订阅模式
   我想起来ZeroMQ、Mqtt。这两个网络协议,也有发布/订阅的概念。
   我想会不会EventBus也是基于网络完成的。(看了源码就知道了)。
主要功能:替代Intent Handler Broadcast Activity Service 组件之间
传递消息的,使用它可以使得事件发送者,和事件接收处理者很好的解耦和。
看过源码之后发现确实不是基于网络的。发布/订阅是一种消息发送处理的设计模式,可以使用网络、使用数据结构(队列)进行存取的过程,存-发布 取-订阅 。EventBus使用的是后者,存取事件使用的数据结构是 Map。
再者如果是基于网络的那么所有使用EventBus的app不就都要添加使用网络的权限了吗? 
    
    同步两种方式
      1. 同步代码块 synchronized(类名.class) {}
      2. 同步方法 public synchronized void method(){}
   
   EventBus
    使用
      在onCreate 中 register 在 onDestory中unregister
       2.2 使用方法名标识不同的模式。方法名以 onEvent 开头,以MainThread BackgroundThread...结尾
      3.0 使用注解为消息选择一种处理模式
      
    获取EventBus对象的两种方式        
      1.EventBus.getDefault() 是一个单例,和getInstance是一个意思

            在这里可以看到 是一个 典型的单例模式, 懒汉式
懒汉式- 程序运行到需要这个类的对象的时候,调用getInsttance \getDefault的时候才会去判断是否需要创建对象,需要就创建一个单例。 
饿汉式- 当类加载进内存的时候就已经创建了单例对象, 就等着程序员同学去调用了。

这两种方式总是记混,   懒汉-代码获取单例才创建,  饿汉-类加载就已经创建等待使用
      2.使用EventBus.builder.build();手动构建,不推荐。
      构建者(builder) 共同的特点是,
      
      
      EventBus 是一个事件发布和订阅的框架
      
      每一个事件处理函数都有自己的线程模式,
      这个模式决定了处理函数在哪个线程中执行
      
      四种线程模式
      1. MAIN  模式
         事件处理方法将会在android的主线程中被调用
         如果 post thread 发送事件的线程也是主线程
         事件处理方法会直接被调用。很明显处于UI线程中
         使用这种方法需要避免阻塞线程 avoid 耗时操作
         
      2. POSTING 模式
         事件处理方法执行在事件发布的线程中 默认是 POSTING 模式
         如果主线程发布事件采用的是默认模式。事件处理方法也要
         避免耗时操作 avoid 阻塞
         适合用于一些会很快完成的任务
         
      3. BACKGROUND 模式
         如果事件发起线程不是主线程,事件处理者会被在发起线程中直接调用
         如果是主线程,会使用一个后台线程来执行,这个线程专为BackGround准备的
         所有在这种情况下产生的POST 方法都会在这个线程中执行,
         因此要避免执行耗时操作,导致阻塞其他的后台处理事件。
    
      4. ASYNC 模式
         加入到一个特殊的线程中, 事件发起线程不会等待事件
         处理者的,两边同步执行, 使用这种模式执行耗时操作。
         但是要避免同一时间触发大量的同步线程,为了限制当前
         的线程数量, 用的是线程池
         
         EventBus 中有一个(ExecutorService)线程池。
         其中 BACKGROUND 和 ASYNC 模式使用的都是这一个线程池。
         那么 BACKGROUND 和 ASYNC 有什么区别呢?BACKGROUND中的
         POST方法是在这个线程池中一次调用的,而ASYNC中的POST方法
         是会被并发调用的。
 
    处理事件的方法所在类必须已经有对象在,该类必须要调用
    EventBus.getDefault().unregister(this);
    EventBus.getDefault().register(this);
      
    有空做一下源码分析,思路清晰有写下来
    其中有两点:
      1. 弄清楚EventBus中根据注解反射获取到方法存放的Map结构。register方法提到
      2. 弄清楚EventBus内部有一个 线程池, 本人挺感兴趣了,而且两个模式BACKGROUND 和 ASYNC 共同使用这一个线程池。其中怎么调用,怎么控制。需要弄明白
      3. By The Way. EventBus源码中涉及到一些设计模式,单例模式、建造者模式;涉及到
      一些Java语法。需要重新回顾。
ThreadLocal (在Handler的源码分析中使用到此类) CopyOnWriteArrayList   
单独一个 final 修饰类 及其成员,什么意思?




                                                                                          ------------肖村KFC(开封菜 ^_^)

0 0
原创粉丝点击