1.EventBus的作用
EventBus是一款针对Android端优化的发布/订阅消息总线,它简化了应用程序内各组件间、组件与后台线程间的通信。其主要功能是用来替代传统的Intent、Handler、BroadCast,在Fragment、Activity、Service以及线程之间来传递消息。
2.使用教程
使用studio开发的同学直接在build.gradle依赖一些即可,目前最新版本应该是3.0了
compile 'org.greenrobot:eventbus:3.0.0'
1-定义一个消息类,用来封装要传输的数据,就是一个普通的bean类
public class MsgEvent {
private String name;
private String content;
public String getName() {
return name;
}
public MsgEvent(String name, String content) {
this.name = name;
this.content = content;
}
public void setName(String name) {
this.name = name;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
}
2-在需要接受数据的类中注册事件,这里是在Fragment定义的,需要创建实例的时候就注册
@Override
public void onAttach(Context context) {
super.onAttach(context);
LogUtil.e("tag", "注册");
EventBus.getDefault().register(this);
}
3-发送事件
String callName = JsonUtils.getJsonValue(json, "callName");
String content = JsonUtils.getJsonValue(json, "content");
final MsgEvent msgEvent = new MsgEvent(callName, content);
// Bundle bundle = new Bundle();
// bundle.putString("callName", callName);
// bundle.putString("content", content);
// switchFragment(new SendMsgFragment(), bundle);
switchFragment(new SendMsgFragment(), null);
CommonUtils.executeMute(false);
new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(30);
EventBus.getDefault().post(msgEvent);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
private void switchFragment(Fragment fragment, Bundle bundle) {
FragmentTransaction transaction = MainActivity.mian.getSupportFragmentManager().beginTransaction();
// fragment.setArguments(bundle);
transaction.add(R.id.fl_container_main, fragment);
transaction.addToBackStack(null);
transaction.commit();
}
之前使用的Bundle给Fragment传递数据,另外在Fragment切换时,实例化会有一定的延时,注册事件并不是那么及时,所以在这里延迟30ms发送事件
4-接受并处理事件
@Subscribe(threadMode = ThreadMode.MAIN)
public void getData(MsgEvent event) {
LogUtil.e("tag", event.getName());
et_callname.setText(event.getName());
et_content.setText(event.getContent());
}
3.0之前有4个方法来处理事件,3.0采取了注解的方式,方法名可以随便取,
- threadMode = ThreadMode.MAIN表示在主线程中处理事件,
- ThreadMode.POSTING(发送消息的线程),
- ThreadMode.ASYNC(无论事件在哪个线程发布,该事件处理函数都会在新建的子线程中执行。同样,此事件处理函数中禁止进行UI更新操作)
- ThreadMode.BACKGROUND(如果事件是在UI线程中发布出来的,那么该事件处理函数就会在新的线程中运行,如果事件本来就是子线程中发布出来的,那么该事件处理函数直接在发布事件的线程中执行。在此事件处理函数中禁止进行UI更新操作)
public void onEvent(MsgEvent1 msg)// 发送者在哪个线程发送的,该方法也在哪个线程中处理事件
public void onEventMainThread(MsgEvent1 msg)// 不管发送者在哪个线程发送的,该方法都会在主线程中处理事件
public void onEventBackgroundThread(MsgEvent1 msg)// 如果发送者是在子线程发送的,那么该方法也在同一个子线程处理事件,如果发送者是在主线程,那么该方法在一个线程池中处理事件
public void onEventAsync(MsgEvent1 msg)// 不管发送者在哪个线程发送的,该方法都在线程池中执行
5- 取消消息订阅
@Override
public void onDestroy() {
super.onDestroy();
EventBus.getDefault().unregister(this);
}
上面演示了Fragment中使用的实例,另外在Activty之间Activity与Fragment之间或者是线程之间的数据传输都是非常方便的