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之間或者是線程之間的數據傳輸都是非常方便的