EventBus是一款针对Android优化的发布/订阅事件总线,简化了应用程序内各组件间、组件与后台线程间的通信。
主要是替代 handler BroadCast 在 Fragment 、Activity 、Service 线程之间传递消息。
EventBus 概述
1、EventBus 有三个主要的元素:
- Event:事件,可以是任意类型的对象。
- Subscriber:事件订阅者,
在EventBus3.0之前消息处理的方法只能限定于onEvent、onEventMainThread、onEventBackgroundThread和onEventAsync,他们分别代表四种线程模型。而在EventBus3.0之后,事件处理的方法可以随便取名,但是需要添加一个注解@Subscribe,并且要指定线程模型(默认为POSTING),四种线程模型下面会讲到。 - Publisher:事件发布者,可以在任意线程任意位置发送事件,直接调用EventBus的post(Object)方法。可以自己实例化EventBus对象,但一般使用EventBus.getDefault()就好了,根据post函数参数的类型,会自动调用订阅相应类型事件的函数。
2、EventBus3.0有以下四种ThreadMode(线程模型):
- POSTING(默认):发布事件和接收事件在同一个线程,也就是说该事件在哪个线程发布出来的,事件处理函数就会在这个线程中运行。
- MAIN: 事件的处理总是在UI线程中执行。
- ASYNC:无论事件在哪个线程发布,该事件处理函数总是在新建的子线程中执行,同样,此事件处理函数中禁止进行UI更新操作。
- BACKGROUND:如果事件是在UI线程中发布出来的,那么该事件处理函数就会在新的线程中运行,如果事件本来就是子线程中发布出来的,那么该事件处理函数直接在发布事件的线程中执行。
EventBus 快速入门
0、首先为项目添加 EventBus 依赖:
compile 'org.greenrobot:eventbus:3.1.1'
1、定义事件类:
public static class MessageEvent { /* Additional fields if needed */ }
2、准备订阅者:
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMessageEvent(MessageEvent event) {/* Do something */};
3、发送事件:
EventBus.getDefault().post(new MessageEvent());
EventBus 实际应用
这里举例子具体介绍 EventBus 的用法,实现Activity之间传值。
1、定义消息事件类
package com.wshunli.eventbusdemo;
public class MessageEvent {
private String message;
public MessageEvent(String message) {
this.message = message;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
@Override
public String toString() {
return "MessageEvent{" +
"message='" + message + '\'' +
'}';
}
}
2、注册和取消订阅事件
根据组件的声明周期,在 MainActivity.java 中注册/取消订阅事件。
package com.wshunli.eventbusdemo;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;
import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;
public class MainActivity extends AppCompatActivity {
private TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 注册订阅事件
EventBus.getDefault().register(this);
// 跳转到 SecondActivity
findViewById(R.id.bt).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
startActivity(new Intent(MainActivity.this, SecondActivity.class));
}
});
textView = findViewById(R.id.text);
}
@Override
protected void onDestroy() {
super.onDestroy();
// 取消订阅事件
EventBus.getDefault().unregister(this);
}
}
3、添加消息处理函数
在 MainActivity.java 中添加事件的处理函数:
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMessageEvent(MessageEvent event) {
textView.setText(String.format("接收到发送的事件:%s", event.getMessage()));
}
我们选择 threadMode = ThreadMode.MAIN
表示总是在 主线程 中执行。
4、发布事件
在 SecondActivity 中发布事件:
package com.wshunli.eventbusdemo;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import org.greenrobot.eventbus.EventBus;
public class SecondActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
findViewById(R.id.bt).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
EventBus.getDefault().post(new MessageEvent("来自SecondActivity的消息"));
finish();
}
});
}
}
5、接收到消息
在 MainActivity 接受到来自 SecondActivity 中发送的消息:
ProGuard 混淆规则
-keepattributes *Annotation*
-keepclassmembers class ** {
@org.greenrobot.eventbus.Subscribe <methods>;
}
-keep enum org.greenrobot.eventbus.ThreadMode { *; }
# Only required if you use AsyncExecutor
-keepclassmembers class * extends org.greenrobot.eventbus.util.ThrowableFailureEvent {
<init>(java.lang.Throwable);
}
参考资料
1、greenrobot/EventBus: Event bus for Android and Java that simplifies communication between Activities, Fragments, Threads, Services, etc. Less code, better quality.
https://github.com/greenrobot/EventBus
2、Android事件总线(一)EventBus3.0用法全解析 - 刘望舒的专栏 - CSDN博客
http://blog.csdn.net/itachi85/article/details/52205464
3、EventBus 3.0的用法详解(一) - neu - SegmentFault
https://segmentfault.com/a/1190000004279679
4、Android事件分发库的使用-慕课网
https://www.imooc.com/learn/871
评论 (0)