作者:某人_Valar
如需转载请保留原文链接
EventBus的GitHub地址:https://github.com/greenrobot/EventBus
本文会把包括两个EventBus的案例,来简单实现EventBus的使用。
相关文章
本文结构
- 1.EventBus的使用
- 2.粘性(sticky)EventBus的使用
两者的区别,普通的EventBus使用都是需要先注册(register),再发送消息(POST),才能接收到数据。
如果使用postSticky发送,就先接受到数据,之后在进行注册时,数据就随之展现出来。
1.EventBus的使用
1.1 引用包
compile 'org.greenrobot:eventbus:3.0.0'
1.2 准备
新建了一个EventBusActivity当做发送数据界面,新建一个ResultActivity用于呈现结果,在activity_main.xml中添加一个按钮,
<Button
android:id="@+id/bt_eventBus"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="点击进入EventBus测试"
/>
并在MainActivity中添加一个点击事件跳转到EventBusActivity。
Button mButton = (Button) findViewById(R.id.bt_eventBus);
mButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(MainActivity.this,EventBusActivity.class);
startActivity(intent);
}
});
1.3 注册与解注册
在EventBusActivity的onCreate()方法中注册
EventBus.getDefault().register(EventBusActivity.this);
重写EventBusActivity的onDestroy()方法进行解注册
@Override
protected void onDestroy() {
super.onDestroy();
//3.3 解注册
EventBus.getDefault().unregister(EventBusActivity.this);
}
1.4 创建发送消息类
新建一个MyMessage类如下
public class MyMessage {
public String name;
public MyMessage(String name){
this.name = name;
}
}
1.5 发送消息
可自己添加一个按钮,点击即发送
mbutton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
EventBus.getDefault().post(new MyMessage("主线程发送的数据-001"));
//发送之后跳转到ResultActivity界面查看结果
Intent intent = new Intent(EventBusActivity.class,ResultActivity.class);
startActivity(intent);
}
}
1.6 接收消息
为ResultActivity添加一个TextView用于展示接收到的数据。
@Subscribe(threadMode = ThreadMode.MAIN) //用注解的方式设定接收方式
public void ReceiveMessage(MyMessage myMessage){
//显示接收的消息
mTextView.setText(myMessage.name);
}
这样我们第一个EventBus案例就实现了。
2.粘性EventBus的使用
2.1-2.2 参考本文1.1与1.2
2.3 创建发送消息类(与1.4相同)
public class MyMessage {
public String name;
public MyMessage(String name){
this.name = name;
}
}
2.4 发送消息
这里所使用的就是 EventBus.getDefault().postSticky()方法
mbt_eventBus_sticky.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//发送消息
EventBus.getDefault().postSticky(new StickyMessage("这里是粘性事件发送的数据-002"));
//跳转到接收消息的页面
Intent intent = new Intent(EventBusActivity.this,ResultActivity.class);
startActivity(intent);
}
});
2.5 接收消息
在确定接收方式之后,需要加上sticky = true
@Subscribe(threadMode = ThreadMode.MAIN,sticky = true)
public void ReceiveSticky(StickyMessage stickyMessage){
mTextView.setText(stickyMessage.msg); //这时虽然已经为TextView赋值,但是暂时不会显示出来。
}
2.6 注册
在ResultActivity设置一个按钮,点击即注册EventBus
这里要注意添加一个判断条件,如果EventBus被注册多次会出现异常。
mbt_receiveSticky.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (isFirst){
// 注册
EventBus.getDefault().register(ResultActivity.this);
isFirst = false;
}else {
Toast.makeText(ResultActivity.this,"你已经注册过了EventBus",
Toast.LENGTH_SHORT).show();
}
}
});
2.7解注册
重写ResultActivity的onCreate()方法
@Override
protected void onDestroy() {
super.onDestroy();
EventBus.getDefault().removeAllStickyEvents(); //移除所有的粘性事件
EventBus.getDefault().unregister(ResultActivity.this);
}
到此粘性EventBus的案例也就结束了。
相关文章
网友评论