android eventbus 使用,Android之EventBus使用与分析

EventBus是一款由Greenrobot开源的轻量级发布/订阅事件总线,简化了Android组件间的通信。通过定义事件类、使用@Subscribe注解订阅函数,并在组件生命周期中注册和注销,可以方便地发送和处理事件。EventBus支持四种线程模式,包括POSTING、MAIN、BACKGROUND和ASYNC,确保在合适的线程中执行事件响应。源码分析显示,EventBus通过反射和线程池实现高效的消息传递。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

EventBus定义

EventBus 是Greenrobot开源的一款轻量级的发布/订阅事件总线。

9e64959ae164

EventBus-Publish-Subscribe.png

Publisher方发布Event事件

Subciber方响应事件,执行响应函数onEvent()

优点

简化组件之间的通信,在Activitys, Fragments,和后台线程中都表现良好。

避免复杂且容易出错的依赖关系和生命周期问题

如何使用:

1 定义事件:

public static class MessageEvent { /* Additional fields if needed */ }

2 在你需要响应事件的地方定义Subscribe函数。添加@Subscribe注解和threadMode 类型(后面会详情介绍threadMode)

@Subscribe(threadMode = ThreadMode.MAIN)

public void onMessageEvent(MessageEvent event) {/* Do something */};

3 在你的Subscribe函数所在组件的生命周期函数中执行注册和注销函数

@Override

public void onStart() {

super.onStart();

EventBus.getDefault().register(this);

}

@Override

public void onStop() {

super.onStop();

EventBus.getDefault().unregister(this);

}

4 发送事件

EventBus.getDefault().post(new MessageEvent());

ThreadMode

EventBus共包括4种模式:

POSTING:在post所在线程执行

MAIN:在主线程(UI thread)中执行

BACKGROUND:在后台线程中执行,适合耗时短的处理

ASYNC:在单独线程中执行,适合耗时较长的处理

源码分析

void register(Object subscriber)

register()解析当前subscriber的class,获取所有Subscribe 函数,保存到对应的events的map中。

subscriberMethodFinder是其负责解析class的辅助函数。

Class> subscriberClass = subscriber.getClass();

List subscriberMethods = subscriberMethodFinder.findSubscriberMethods(subscriberClass);

synchronized (this) {

for (SubscriberMethod subscriberMethod : subscriberMethods) {

subscribe(subscriber, subscriberMethod);

}

}

保存在subscriptionsByEventType中,字典类型,Event class 和 subscription list集合一一对应。

private final Map, CopyOnWriteArrayList> subscriptionsByEventType;

void post(Object event)

post 发送event到EventBus的eventQueue。

PostingThreadState postingState = currentPostingThreadState.get();

List eventQueue = postingState.eventQueue;

eventQueue.add(event);

发送队列里的所有event

while (!eventQueue.isEmpty()) {

postSingleEvent(eventQueue.remove(0), postingState);

}

获取event的所有subscriber 函数

CopyOnWriteArrayList subscriptions;

synchronized (this) {

subscriptions = subscriptionsByEventType.get(eventClass);

}

根据threadModel类型,执行subscriber 函数

......

case POSTING:

invokeSubscriber(subscription, event);

break;

case MAIN:

if (isMainThread) {

invokeSubscriber(subscription, event);

} else {

mainThreadPoster.enqueue(subscription, event);

}

break;

......

反射方式执行:

void invokeSubscriber(Subscription subscription, Object event) {

try {

subscription.subscriberMethod.method.invoke(subscription.subscriber, event);

} ......

}

异步线程处理:EventBus内部维护一个线程池负责处理

private final static ExecutorService DEFAULT_EXECUTOR_SERVICE = Executors.newCachedThreadPool();

ExecutorService executorService = DEFAULT_EXECUTOR_SERVICE;

总结:

EventBus 使用非常简单,代码结构非常清晰,非常方便阅读,值得学习。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值