前段时间有点忙,没有更新Blog感觉学到的东西应该及时总结。毕竟,程序员要做的事情太多了,害怕自己忘记了,以后面试慌乱,所以,及时总结所看的每一个小的知识点,希望大家也可以更加厉害,未来一片辉煌。
下面开始介绍EventBus和观察者模式
一:目前EventBus最新版本是3.0,本文基于3.0编写的。
GitHub : github.com/greenrobot/…
官方文档:greenrobot.org/eventbus/do…
1.1 EventBus概述
EventBus 是一个 Android 事件发布/订阅框架,通过解耦发布者和订阅者简化 Android 事件传递,这里的事件可以理解为消息,本文中统一称为事件。事件传递既可用于 Android 四大组件间通讯,也可以用户异步线程和主线程间通讯等等。
传统的事件传递方式包括:Handler、BroadCastReceiver、Interface 回调,相比之下 EventBus 的优点是代码简洁,使用简单,并将事件发布和订阅充分解耦。
1.2 概念
事件(Event):又可称为消息,本文中统一用事件表示。其实就是一个对象,可以是网络请求返回的字符串,也可以是某个开关状态等等。事件类型(EventType)
指事件所属的 Class。
事件分为一般事件和 Sticky 事件,相对于一般事件,Sticky 事件不同之处在于,当事件发布后,再有订阅者开始订阅该类型事件,依然能收到该类型事件最近一个 Sticky 事件。
订阅者(Subscriber):订阅某种事件类型的对象。当有发布者发布这类事件后,EventBus 会执行订阅者的 onEvent 函数,这个函数叫事件响应函数
。订阅者通过 register 接口订阅某个事件类型,unregister 接口退订。订阅者存在优先级,优先级高的订阅者可以取消事件继续向优先级低的订阅者分发,默认所有订阅者优先级都为 0。
发布者(Publisher):发布某事件的对象,通过 post 接口发布事件。
1.3 订阅者、发布者、EventBus 关系图
- 官方提供的关系图
2:EventBus的使用:
a: Subscriber需要注册(注意点:@Subscribe(threadMode = ThreadMode.MAIN)必须写,其次方法必须
是public,否则会报错);
b: ThreadMode 共有四类:
PostThread
:默认的 ThreadMode,表示在执行 Post 操作的线程直接调用订阅者的事件响应方法,不论该线程是否为主线程(UI 线程)。当该线程为主线程时,响应方法中不能有耗时操作,否则有卡主线程的风险。适用场景:对于是否在主线程执行无要求,但若 Post 线程为主线程,不能耗时的操作;MainThread
:在主线程中执行响应方法。如果发布线程就是主线程,则直接调用订阅者的事件响应方法,否则通过主线程的 Handler 发送消息在主线程中处理——调用订阅者的事件响应函数。显然,MainThread
类的方法也不能有耗时操作,以避免卡主线程。适用场景:必须在主线程执行的操作;BackgroundThread
:在后台线程中执行响应方法。如果发布线程不是主线程,则直接调用订阅者的事件响应函数,否则启动唯一的后台线程去处理。由于后台线程是唯一的,当事件超过一个的时候,它们会被放在队列中依次执行,因此该类响应方法虽然没有PostThread
类和MainThread
类方法对性能敏感,但最好不要有重度耗时的操作或太频繁的轻度耗时操作,以造成其他操作等待。适用场景:操作轻微耗时且不会过于频繁,即一般的耗时操作都可以放在这里;Async
:不论发布线程是否为主线程,都使用一个空闲线程来处理。和BackgroundThread
不同的是,Async
类的所有线程是相互独立的,因此不会出现卡线程的问题。适用场景:长耗时操作,例如网络访问。。
c: Publisher根据自己的需要发送Sticky事件和一般事件。
以上是我使用了EventBus的一些心得体会,很多地方没有很全面,希望大家见谅。
观察者模式
1.1 观察者模式简单介绍
观察者模式又被称作发布/订阅模式,观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。
2.1 观察者模式的使用
使用了EventBus之后,感觉之前使用观察者模式真的很浪费时间,需要自己封装。但是,也有一些关键点或者EventBus不具备的好处。下面来简单介绍一下:
1:观察这模式和EventBus的理念我觉得差不多。都是需要订阅时间,发布者发布信息,订阅者及时更新信息。
2:观察者模式的好处我哦感觉就是更加灵活,可以根据自己的需要定制属于自己业务的接口(subcribe)。在Activity、fragment、service里面没有任何限制,完全解耦。
以上是我对于观察者模式的理解,更多的知识点由于本人不善言表没写出来,大家遇到这方面的问题希望及时和我沟通,我使用观察者模式已经有差不多一年半的时间了。所以,希望大家可以及时和我交流沟通,共同进步。
注:EventBus 所有学习资源来自 http://a.codekk.com/detail/Android/Trinea/EventBus%20%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90,仅供学习,如有侵权,请告知,及时删除。