关闭

EventBus的初步接触

标签: AndroidEventBus
203人阅读 评论(0) 收藏 举报
分类:

在项目开发过程中,我们对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

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:25560次
    • 积分:487
    • 等级:
    • 排名:千里之外
    • 原创:17篇
    • 转载:0篇
    • 译文:4篇
    • 评论:13条
    文章分类