您的位置:首页 > 其它

EventBus 3.0 简单使用

2016-08-27 18:42 267 查看
今天周六,可谓是阳光明媚啊,早上一觉睡到九点,昨天晚上喝了一瓶啤酒,睡眠质量就是高啊。今天洗了洗衣服,晒了晒被子,刷了刷鞋,然后跑着去了超市,买了点东西,主要是买的苹果和啤酒。还买了蛤蜊,自从毕业以后就没吃过蛤蜊,晚上炒个蛤蜊喝点啤酒,也是没谁了!进入正题

EventBus 3.0 简单使用,绝对不是老司机。

参考网址,EventBus 官网 EventBus 刘望舒csdn

EventBus 和Otto 作用都是为了简化Android 组件之间的通信,优点是开销小,代码更优雅,以及将发送者和接收者解耦

举个Activity之间通信的例子,下面看代码

//先自定义一个对象,组件之间通信并不一定非得传递对象,基本数据类型也是可以的

public class MessageEvent {
public String message;

public MessageEvent(String message) {
this.message = message;
}

public void setMessage(String message) {
this.message = message;
}

public String getMessage() {
return message;
}
}


1: MainActivity 启动SecondActivity,在SecondActivity中点击一个按钮,发布一个字符串,更新MainActivity 中一个按钮的显示的文字

//在MainActivity 的onCreate方法中注册订阅事件
//EventBus.getDefault().register(MainActivity.this);
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//在MainActivity 的onCreate方法中注册订阅事件
EventBus.getDefault().register(MainActivity.this);
button = (Button) findViewById(R.id.button);
//启动 SecondActivity
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
startActivity(new Intent(MainActivity.this, SecondActivity.class));
}
});


//在MainActivity处理事件,方法名随便写
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMessageEvent(String  str) {
button.setText(str);
}


//在在MainActivity 的onDestroy方法中取消注册订阅事件
@Override
protected void onDestroy() {
EventBus.getDefault().unregister(this);
super.onDestroy();
}


//SecondActivity发布事件
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
findViewById(R.id.button2).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//使用post方法发布一个字符串
EventBus.getDefault().post("今天周六,可谓是阳光明媚啊!");
finish();
}
});
}


看效果



比如说,SecondActivity需要发布一个对象,而不是简单的数据类型也很简单。

EventBus.getDefault().post(new MessageEvent("今天周六,可谓是阳光明媚啊!"));


然后更改MainActivity的处理事件方法,就可以了

@Subscribe(threadMode = ThreadMode.MAIN)
public void onMessageEvent(MessageEvent event) {
button.setText(event.message);
}


2:粘性事件。订阅粘性事件意思就是这个事件发布的时候,你并没有订阅,但是后来你订阅了此类型的事件,这时候你依然会接受到这个发布的事件。就好比NBA球赛直播的时候你没看,但是直播结束后,你可以看看录像。就是这么个意思。

修改MainActivity的代码

//在onCreate的时候不注册,直接跳转,SecondActivity
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button = (Button) findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
startActivity(new Intent(MainActivity.this, SecondActivity.class));
}
});
button1 = (Button) findViewById(R.id.button1);
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//注册事件,这时候处理事件的onMessageEvent依然能接收到事件
EventBus.getDefault().register(MainActivity.this);
}
});
}


//处理事件方法  sticky = true
@Subscribe(threadMode = ThreadMode.POSTING, sticky = true)
public void ononMoonStickyEvent(MessageEvent messageEvent) {
button1.setText(messageEvent.getMessage());
}


//SecondActivity postSticky方法不再是post方法了
EventBus.getDefault().postSticky(new MessageEvent("今天周六,可谓是阳光明媚啊!"));


看效果



3 :手动移除粘性事件,如果我们想手动移除粘性事件,让这个粘性事件不能再被订阅者接收到。

//在MainActivity中写一个方法
public void remove() {
MessageEvent stickyEvent = EventBus.getDefault().getStickyEvent(MessageEvent.class);
if (stickyEvent != null) {
//打印然后移除粘性事件
Log.e("tag", stickyEvent.getMessage());
EventBus.getDefault().removeStickyEvent(stickyEvent);
}
}


修改button1的点击事件

remove();
EventBus.getDefault().register(MainActivity.this);


在注册之前,先把粘性事件移除,之后注册,但是处理粘性事件的ononMoonStickyEvent方法并没有执行,因为事件已经收不到了。


最后解释一下 @Subscribe(threadMode = ThreadMode.MAIN) 是什么鬼。

//摘自刘望舒的博客,顶部有链接。
EventBus3.0有以下四种ThreadMode:

POSTING(默认):如果使用事件处理函数指定了线程模型为POSTING,那么该事件在哪个线程发布出来的,事件处理函数就会在这个线程中运行,也就是说发布事件和接收事件在同一个线程。在线程模型为POSTING的事件处理函数中尽量避免执行耗时操作,因为它会阻塞事件的传递,甚至有可能会引起ANR。

MAIN: 事件的处理会在UI线程中执行。事件处理时间不能太长,长了会ANR的。

BACKGROUND:如果事件是在UI线程中发布出来的,那么该事件处理函数就会在新的线程中运行,如果事件本来就是子线程中发布出来的,那么该事件处理函数直接在发布事件的线程中执行。在此事件处理函数中禁止进行UI更新操作。

ASYNC:无论事件在哪个线程发布,该事件处理函数都会在新建的子线程中执行,同样,此事件处理函数中禁止进行UI更新操作。


行,今天就总结到这里吧,该做饭吃饭了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: