淺談EventBus框架的使用

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章