EventBus的初步接触

Posted 碎格子

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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的其他功能。^_^

以上是关于EventBus的初步接触的主要内容,如果未能解决你的问题,请参考以下文章

EventBus使用详解——初步使用EventBus

EventBus使用详解——初步使用EventBus

EventBus使用详解——初步使用EventBus

EventBus使用详情源码分析和注意事项

EventBus使用详解

EventBus使用详解