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的初步接触的主要内容,如果未能解决你的问题,请参考以下文章