使用EventBus来代替Intent、Handler、Broadcast进行模块间通信、模块与后台线程进行通信,避免代码量大时代码高度耦合:
1、首先在项目的 build.gradle 文件中的 dependencies下加入如下远程依赖:
compile 'org.greenrobot:eventbus:3.1.1'
然后点击 Sync Now等待项目build完成即可。
混淆需加入如下代码在自己的混淆文件中:
-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);
}
2、发送消息---Eventbus发送消息发送的都是对象 基本数据类型不可被发送(如 int,但是integer可以直接被发送);
3、接收消息---@Subscribe注解加在自定义方法上接收消息,同时注解后要加上线程模式(默认是posting模式)。
接收消息的地方要注册事件以及解除注册;EventBus.getDefault().register();以及unregister()来注册以及取消注册。
4、线程模式:一共有四种线程模式
- POSTING (默认模式) 表示事件处理函数的线程与发布消息的线程在同一个线程。
- MAIN 表示事件处理函数的线程在主线程(UI)线程,因此在这里不能进行耗时操作,可以更新UI。
- BACKGROUND 表示事件处理函数的线程在后台线程,因此不能进行UI操作。如果发布事件的线程是主线程(UI线程),那么事件处理函数将会开启一个后台线程,如果果发布事件的线程是在后台线程,那么事件处理函数就使用该线程。
- ASYNC 表示无论事件发布的线程是哪一个,事件处理函数始终会新建一个子线程运行,同样不能进行UI操作。
DEMO:
首先新建要发送的消息对象:TestMessageBean
public class TestMessageBean {
private String mname;
private String des;
public TestMessageBean(String mname, String des) {
this.mname = mname;
this.des = des;
}
public String getMname() {
return mname;
}
public void setMname(String mname) {
this.mname = mname;
}
public String getDes() {
return des;
}
public void setDes(String des) {
this.des = des;
}
}
接收处理事件的activity: TestEventbusReceiver.class
public class TestEventbusReceiver extends AppCompatActivity implements View.OnClickListener {
private static final String TAG = "TestEventbusReceiver";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test_eventbus_receiver);
Button jumpButton = (Button) findViewById(R.id.button4);
jumpButton.setOnClickListener(this);
Log.i(TAG, "onCreate: 执行");
EventBus.getDefault().register(this);
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.i(TAG, "onDestroy: 执行");
EventBus.getDefault().unregister(this);
} @Subscribe(threadMode = ThreadMode.MAIN)
public void onTestMessageBean(TestMessageBean messageBean) {
Log.i(TAG, "onTestMessageBean: 接收到了" +messageBean.getMname()+messageBean.getDes());
}
@Override
public void onClick(View v) {
if (v.getId() == R.id.button4) {
Intent intent = new Intent(this, TestEventbusSend.class);
startActivity(intent);
}
}
}
发送消息的activity:TestEventbusSend.class
public class TestEventbusSend extends AppCompatActivity implements View.OnClickListener {
private String TAG = "TestEventbusSend";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test_eventbus_send);
Button sendButton = (Button) findViewById(R.id.button3);
sendButton.setOnClickListener(this);
}
@Override
public void onClick(View v) {
if (R.id.button3 == v.getId()) {
EventBus.getDefault().post(new TestMessageBean("name","des"));
Log.i(TAG, "onClick: 已发送");
finish();
}
}
}