Android - github EventBus
转载至: Android EventBus源码解析 带你深入理解EventBus
EventBus
1、注册: EventBus.getDefault().register(this); //this:Activity
2、解除注册:EventBus.getDefault().unregister(this); //this:Activity
3、发布事件:EventBus.getDefault().post(new Event()); //Event为自定义类型
4、接收事件:
onEventMainThread(Event e) 接收事件在UI线程中执行;
onEvent 发布事件和接收事件线程在同一个线程;
onEventBackgroundThread UI线程中发布事件,onEventBackground会在子线程中运行;事件在子线程中发布,接收也在子线程执行;
onEventAsync 创建新的线程执行onEventAsync;
进阶:
注册EventBus时,将扫描类中onEventXX开头的函数(分别判断了是否以onEvent开头,是否是public且非static和abstract方法,是否是一个参数。如果都复合,才进入封装的部分),
由Map持有(键:事件参数类型,值:onEventXX方法)
产生消息时,EventBus如何调用处理函数?根据消息的类型
case MainThread:
首先去判断当前如果是UI线程,则直接调用;否则: mainThreadPoster.enqueue(subscription, event);把当前的方法加入到队列,然后直接通过handler去发送一个消息,在handler的handleMessage中,去执行我们的方法。说白了就是通过Handler去发送消息,然后执行的。
case BackgroundThread:
如果当前非UI线程,则直接调用;如果是UI线程,则将任务加入到后台的一个队列,最终由Eventbus中的一个线程池去调用
executorService = Executors.newCachedThreadPool();。
case Async:
将任务加入到后台的一个队列,最终由Eventbus中的一个线程池去调用;线程池与BackgroundThread用的是同一个。
这么说BackgroundThread和Async有什么区别呢?
BackgroundThread中的任务,一个接着一个去调用,中间使用了一个布尔型变量handlerActive进行的控制。
Async则会动态控制并发。
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步