1简介
我眼中的EventBus :就是在一个activity修改另一个activity的UI控件,主线程的事件逻辑的一个工具类;
官方解释: 简化了组件之间的通信 将事件发送方和接收方 执行与活动、碎片和后台线程 避免了复杂的和容易出错的依赖性和生命周期问题
很快,专门为高性能优化 很小(< 50 k jar) 拥有先进的功能,如交付线程,用户优先级等。
2.demo使用效果图
3项目集成EventBus的步骤
1、下载EventBus
2、让自己的项目以来EventBus
3、自定义一个事件(不需要继承任何类),通常我比较喜欢定义一个Message类
4、定义回调函数,相当于观察者模式中的on***Listener函数,在EventBus中可以定义四种类型的回调函数:
a、onEvent 它和ThreadModel中的PostThread对应,这个也是默认的类型,当使用这种类型时,回调函数和发起事件的函数会 在同一个线程中执行
b、onEventMainThread,当使用这种类型时,回调函数会在主线程中执行,这个在Android中非常有用,因为在Android中禁止在子线 程中修改UI
c、onEventBackgroundThread,当使用这种类型时,如果事件发起函数在主线程中执行,那么回调函数另启动一个子线程,如果事 件发起函数在子线程执行,那么回调函数就在这个子线程执行。
d、onEventBusAsync,当使用这种类型时,不管事件发起函数在哪里执行,都会另起一个线程去执行回调。
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tvNum = (TextView) findViewById(R.id.num);
//初始化Event
EventBus.getDefault().register(this);
}
(2)消息的接受处理(分了两种情况,相当于传入的不同的事件吧)
/** 接收到事件后更新详情,post()传入的是Integer 型*/
public void onEventMainThread(Integer i) {
//SpannableStringBuilder 用法见http://blog.youkuaiyun.com/u013424496/article/details/51351541
SpannableStringBuilder ss=new SpannableStringBuilder(i+" onEventMainThread(int i)");
ss.setSpan(new ForegroundColorSpan(Color.RED), 0, 1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
tvNum.setText(ss);
}
/** 接收到事件后更新详情,post()传入的是String 型 */
public void onEventMainThread(String i ){
tvNum.setText(i);
DownActivity.setBtn("呵呵,你会变么");
}
(3)注销 (这里当然也是可以在onPause中注销的,不过一般不这么做,毕竟程序还没有退出,这个界面还是有可能接受到消息的)
@Override
protected void onDestroy() {
super.onDestroy();
EventBus.getDefault().unregister(this);
}
(4)发送消息(不在MainActivity这个类中了)
Integer i = MainActivity.num++;
EventBus.getDefault().post(i);
DownActivity中
EventBus.getDefault().post("再次点击第二个按钮改变");
好了大体就是这样,这个可以用到夜间模式,或者在app中切换语言的时候中,就不会出现闪屏的问题;
Gradle:
compile 'org.greenrobot:eventbus:3.0.0'
Maven:
<dependency>
<groupId>org.greenrobot</groupId>
<artifactId>eventbus</artifactId>
<version>3.0.0</version>
</dependency>
Otto | 一个基于Guava的增强的事件总线 |