背景:
昨天看了启舰大神的关于EventBus的文章,很久以前的东西我居然没使用,今天学习一下。
何为EventBus(https://github.com/greenrobot/EventBus)
官方如是说:EventBus is a publish/subscribe event bus optimized for Android.EventBus是针对Android优化的发布/订阅事件总线。值得一提的是这家公司也出品了GreenDao这个库。
优点:
简化组件间的关联;使你的代码简化;快速;体积小;具有先进的特性,如交付线程、订阅者优先级等。
使用步骤:
测试场景:从第一个Activity(取名A)跳转到第二个Activity(取名B),然后从B回到A,需要携带一些数据到A(当然不用EventBus也有很多解决方案,这里只学习EventBus的优点和其它方案的缺点,开玩笑)。
代码实现先搭建这个情形,目前和EventBus还没有关系:
A的布局:
<TextView
android:id="@+id/text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="跳转"/>
A的代码:
findViewById(R.id.text).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
startActivity(intent);
}
});
B的布局:
<TextView
android:id="@+id/text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="第二个界面"/>
<Button
android:id="@+id/back"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true"
android:text="返回上一页"/>
B的代码:
findViewById(R.id.back).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
至此把场景搭建完了,此时和EventBus还没有半毛钱关系。
EventBus出场:
定义一个类,自己随意,我这里是EventMessage:
public class MessageEvent {
public final String message;
public MessageEvent(String message) {
this.message = message;
}
}
在接收消息的Activity(A中)注册和解绑和处理收到的信息:
@Override
protected void onStart() {
super.onStart();
EventBus.getDefault().register(this);//注册
}
@Override
protected void onStop() {
super.onStop();
EventBus.getDefault().unregister(this);//解绑
}
@Subscribe(threadMode = ThreadMode.MAIN)//4种模式;3.0之后添加注解并且可以随便给这个方法命名,貌似之前的版本不可以
public void onMessageEvent(MessageEvent messageEvent) {
Toast.makeText(this, messageEvent.message, Toast.LENGTH_SHORT).show();//获取消息并显示
}
Activity(B中)发送消息:
findViewById(R.id.back).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
EventBus.getDefault().post(new MessageEvent("就是测试一下EventBus"));//发送的消息
finish();
}
});
4种模型:
英文点这里 中文点这
踩过的坑:
接收消息的Activity在消息发送前必须已经注册过,所以你切不可在startActivity(intent)后发送消息,还没来得及注册(如果使用粘性事件另当别论)。不可重复注册。
ps:如有错误,欢迎指正。