Android EventBus事件发布流程浅析

 

       如上图所示,简而言之,EventBus是一个用于Android/Java的发布/订阅事件总线,可以简化组件间的数据传输。它的优势在于解耦事件发送者和接受者,在Activities、Fragments以及后台线程和主线程间的数据传输方面表现不错,避免了复杂和容易出错的依赖关系和生命周期问题。

       从源码分析的角度来看,EventBus的数据传输机制,主要是依赖于Java反射机制和自定义注解处理器。对于后者,本章暂且按下不表,集中精力分析EventBus是如何通过反射机制传输数据的。

一、EventBus的实例获取

/** Convenience singleton for apps using a process-wide EventBus instance. */
public static EventBus getDefault() {
    EventBus instance = defaultInstance;
    if (instance == null) {
        synchronized (EventBus.class) {
            instance = EventBus.defaultInstance;
            if (instance == null) {
                instance = EventBus.defaultInstance = new EventBus();
            }
        }
    }
    return instance;
}
public EventBus() {
    this(DEFAULT_BUILDER);
}
private static final EventBusBuilder DEFAULT_BUILDER = new EventBusBuilder();

       从上述代码可知,EventBus的getDefault()方法就是一个采用了单例模式的同步方法,同时分析EventBus的构造器方法可知,EventBus内部的一些参数属性是由EventBusBuilder这个类对象来负责定义的。

public class EventBusBuilder {
    private final static ExecutorService DEFAULT_EXECUTOR_SERVICE = Executors.newCachedThreadPool();

    ...

    MainThreadSupport mainThreadSupport;

    ...

    MainThreadSupport getMainThreadSupport() {
        if (mainThreadSupport != null) {
            return mainThreadSupport;
        } else if (AndroidLogger.isAndroidLogAvailable()) {
            Object looperOrNull = getAndroidMainLooperOrNull();
            return looperOrNull == null ? null :
                    new MainThreadSupport.AndroidHandlerMainThreadSupport((Looper) looperOrNull);
        } else {
            return null;
        }
    }

    //获取主线程Looper
    Object getAndroidMainLooperOrNull() {
        try {
            return Looper.getMainLooper();
        } catch (RuntimeException e) {
            // Not really a functional Android (e.g. "Stub!" maven dependencies)
            return null;
        }
    }


    public EventBus installDefaultEventBus() {
        synchronized (EventBus.class) {
            if (EventBus.defaultInstance != null) {
                throw new EventBusException("Default instance already exists." +
                        " It may be only set once before it's used the first time to ensure consistent behavior.");
            }
            EventBus.defaultInstance = build();
            return EventBus.defaultInstance;
        }
    }


    public EventBus build() {
        return new EventBus(this);
    }

}

       针对EventBusBuilder类,可以简单过一遍,主要是设置了一些属性和生成一些工具,暂时知道它是配合EventBus的构造器方法就好。接着,咱们将注意力转向register方法。

二、E

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值