EventBus的初步接触

在项目开发过程中,我们对onActivityForResult一定不陌生,通常我们希望从当前Activity/Fragment跳到另一个Activity/Fragment去进行一些事件的处理,处理完后将结果发送给第一个Activity/Fragment,这会儿我们就可以重写onActivityForResult,可是在大量的实践下,发现如果如果只有一个Activity进行结果处理,一个Activity发送结果,这种情况下使用onActivityForResult还不算麻烦,但有些情况使用onActivityForResult太过麻烦,比如:我在第一个Activity重写onActivityForResult对返回的结果进行处理,但我需要相继跳转两个或更多的Activity直到有一个Activity处理了事件并setResult,这样的情况就不适合使用onActivityForResult,而引入EventBus就可以轻松地解决这样的问题。

EventBus的好用之处就在于:它是一个基于观察者模式的事件发布/订阅框架,开发者可以通过极少的代码去实现多个模块之间的通信,而不需要以层层传递接口的形式去单独构建通信桥梁。从而降低因多重回调导致的模块间强耦合,同时避免产生大量内部类。

下面就来看看EventBus的使用方法:

  • 首先向AS项目里添加gradle依赖:
// EventBus
compile 'org.greenrobot:eventbus:3.0.0'
  • 在需要进行事件处理的Activity/Fragment的onCreate或者构造方法里进行注册:
EventBus.getDefault().register(this);
  • 订阅处理事件
@Subscribe  
public void onEvent(AnyEventType event) {/* Do something */};

这里有两点需要注意:

1.这里的AnyEventType必须是可以进行实例化的对象类型,不能是简单类型如int、double等。
2.这个@Subscribe后面不接任何ThreadMode则表示事件处理在事件发送的那个线程执行

  • 发送事件
EventBus.getDefault().post(event);
  • 别忘了要注销
@Override
    protected void onDestroy() {
        super.onDestroy();
        eventBus.unregister(this);
    }

只需这四步就搞定了,非常简单。

下面来看看具体代码实现:
MainActivity.java

@Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        FrameLayout container = new FrameLayout(this);
        container.setId(R.id.container);
        setContentView(container);
        EventBus.getDefault().register(this);
        ...
    }

@Override
    protected void onDestroy() {
        super.onDestroy();
        EventBus.getDefault().unregister(this);
    }

    @Subscribe(threadMode = ThreadMode.MAIN)
    public void onReloadPage(String resultCode) {
        if ("OK".equals(resultCode)) {
           //do something
        }
    }

LastActivty.java

@Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                finishActivity();
            }
        });
    }

public void finishActivity() {
        String result = "OK";
        EventBus.getDefault().post(result);
        finish();
    }

顺带说一下关于ThreadMode:
查看源码可以发现这是个枚举类型,包含:POSTING,MAIN,BACKGROUND,ASYNC

ThreadMode含义
POSTING事件处理在事件发送的那个线程执行
MAIN事件在主线程-UI线程执行
BACKGROUND事件在一个后台线程执行(就一个后台线程)
ASYNC事件会单独启动一个线程执行(每个事件都会启动一个线程)

还有一点不得不说的:

  • 注册和事件处理必须在post之前就要进行,否则是不会进行事件处理的。

由于楼主也是才接触EventBus,只是用了EventBus的简单功能,这个Bus其他强大的功能没有深入接触,所以本文只是简单介绍下EvenBus的简单使用方法,有兴趣的朋友可以去了解一下EventBus的其他功能。^_^

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值