浅谈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之间或者是线程之间的数据传输都是非常方便的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值