Eventbus
1. EventBus作用
它简化了应用程序内各个组件之间进行通信的复杂度,尤其是避免了fragment间通信的复杂度。假如我们使用广播来通信,略显麻烦,如果传递的数据是实体类,那么还需要序列化。
正是因为EventBus的解耦并且使用方便,开销小(避免实体类数据序列化)才得以广泛应用。
1.1 三个角色
- Event:事件,可以是任意类型,EventBus会根据事件类型进行全局的通知
- Subscriber:事件订阅者,在EventBus之前我们必须定义以onEvent开头的那几个方法,分别是onEvent、onEventMainThread、onEventBackgroundThread和onEventAsync,而在3.0之后处理的方法名可以随意取,不过需要加上注解@subscribe(),并且指定线程模型,默认是POSTING
- Publisher事件的发布者。我们可以在任意线程里发布事件,一般情况下,使用EventBus.getDefault()就可以得到一个EventBus对象,然后再调用post(Object)方法即可。
1.2 四种线程模型
- POSTING(默认)表示事件处理函数的线程跟发布事件的线程在同一个线程
- Main表示事件处理函数的线程在主线程(UI)线程,因此在这里不能进行耗时操作
- BACKGROUND表示事件处理函数的线程在后台线程,因此不能进行UI操作。如果发布事件的线程是主线程(UI线程),那么事件处理函数将会开启一个后台线程,如果发布事件的线程是后台线程,那么事件处理函数就使用该线程。
- ASYNC表示无论事件发布的线程是哪一个,事件处理函数始终会新建一个子线程运行,同样不能进行UI操作。
引入方式: implementation "org.greenrobot:eventbus:3.3.1"
可参阅其github地址https://github.com/greenrobot/EventBus
2. 基本使用
2.1 事件
public class MyEvent {
private String message;
public MyEvent(String message) {
this.message = message;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
2.2 订阅模块
public class MainActivity extends AppCompatActivity {
private Button button;
private TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button=findViewById(R.id.turn);
textView=findViewById(R.id.myText);
textView.setText("我很生气");
EventBus.getDefault().register(this);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent(MainActivity.this,SecondActivity.class));
}
});
}
@Subscribe(threadMode = ThreadMode.MAIN)
public void Event(MyEvent myEvent){
textView.setText(myEvent.getMessage());
}
@Override
protected void onDestroy() {
super.onDestroy();
if(EventBus.getDefault().isRegistered(this)){
EventBus.getDefault().unregister(this);
}
}
}
使用时需注意要在setContentView()之后进行EventBus的注册,官方推荐在Activity生命周期中的onStart()方法中注册,在onStop()中销毁。
2.3发布事件
public class SecondActivity extends Activity {
private Button button;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.second_activity);
button=findViewById(R.id.button2);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
EventBus.getDefault().post(new MyEvent("滚去第一个"));
finish();
}
});
}
}
运行结果:
在这里secondActivity发布事件,MainActivity接收到消息使得"我很生气"文本改变为"滚回第一个"。