美文网首页
EventBus 传递流程

EventBus 传递流程

作者: 请输入妮称 | 来源:发表于2018-08-26 11:24 被阅读0次

本篇文章基于EventBus 3.0版本。

假设阅读本篇的人已经了解了EventBus的使用方法。

EventBus的使用非常方便,通过观察者模式实现了功能模块之间的解耦合。

EventBus-Publish-Subscribe.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目录。

相关文章

网友评论

      本文标题:EventBus 传递流程

      本文链接:https://www.haomeiwen.com/subject/mpmgiftx.html