本篇文章基于EventBus 3.0版本。
假设阅读本篇的人已经了解了EventBus的使用方法。
EventBus的使用非常方便,通过观察者模式实现了功能模块之间的解耦合。
![](https://img.haomeiwen.com/i5515535/81f84bf9b250e97f.png)
可以看到Publisher和Subscriber是一对多的关系。
在大型项目使用中,Subscriber可能分散在各个类中,而对于新接手项目的人而言,由于不了解业务模块或者文档不明确,经常不知道调用了哪个Subscriber。
所以,如果能够追踪事件的传递流程就会方便很多。具体的就是当Publisher发布Event的时候,打印出所有Subscriber的信息。
比如说这样:
@Subscribe
public void onEvent(EventMessage eventMessage) {
// 打印Subscriber的信息
Log.d(TAG, " subscriber is " + this + " method is " + onEvent);
Toast.makeText(this, eventMessage.message, Toast.LENGTH_SHORT).show();
}
@Subscribe
public void onAnotherEvent(EventMessage eventMessage) {
// 打印Subscriber的信息
Log.d(TAG, " subscriber is " + this + " method is " + onAnotherEvent);
Toast.makeText(this, eventMessage.message, Toast.LENGTH_SHORT).show();
}
这样虽然可以达到目的,但是略显繁琐,所以我们需要找一个方便的办法。
经过对EventBus源码的分析,发现Subscriber的信息被存储在了subscriptionsByEventType
变量里。
private final Map<Class<?>, CopyOnWriteArrayList<Subscription>> subscriptionsByEventType;
因此,如果我们能在EventBus的post方法调用时对subscriptionsByEventType进行筛选,查找出所有被调用者的信息即可。
因此写了一个小的demo供参考:
点击进入 项目github地址
使用姿势:
1.对于EventBus.getDefault对象
调用EventBusProxyFactory.defaultEventBusProxy
即可
首先在自定义Application中进行初始化(当然初始化位置可以根据自己需要调整)
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
EventBusProxyFactory.defaultEventBusProxy(true, new EventBusProxyHandler() {
@Override
public Object beforePost(Object event, boolean isStick) {
return event; // 此处返回不能为空,该event用于事件传递,可以根据自己的需要对原event进行替换
}
@Override
public void afterPost(Object event, boolean isStick) {
//此处打印日志
}
@Override
public void invokedSubscriptions(List<EventBusSubscription> eventBusSubscription) {
//此处打印日志
}
@Override
public void invokedSubscriptionsWhenRegister(List<EventBusSubscription> eventBusSubscription) {
//此处打印日志
}
});
}
}
public class MainActivity extends AppCompatActivity {
public static final String TAG = "MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
EventBus.getDefault().register(this);
findViewById(R.id.textView).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
EventMessage eventMessage = new EventMessage();
eventMessage.message = "from mainActivity";
EventBus.getDefault().post(eventMessage);
}
});
}
@Subscribe(threadMode = ThreadMode.MAIN, sticky = true)
public void onEvent(EventMessage eventMessage) {
Log.d(TAG, " eventMessage is " + eventMessage);
Toast.makeText(this, eventMessage.message, Toast.LENGTH_SHORT).show();
}
@Override
protected void onDestroy() {
super.onDestroy();
EventBus.getDefault().unregister(this);
}
}
2.其他自定义创建的EventBus对象
调用EventBusProxyFactory.eventBusProxy(boolean isDebug, EventBus eventBus, EventBusProxyListener eventBusProxyListener)
具体使用案例请查看GitHub example目录。
网友评论