不再分析了,理解了LiveData后,不难理解这个框架。

阅读本文前,请先阅读[《Jetpack之LiveData源码分析》](/源码分析系列/LiveEventBus源码分析.md)。因为LiveEventBus是基于LiveData构建的。

源码地址:LiveEventBus

典型用法如下:

1
2
3
4
5
6
7
8
// 监听消息
LiveEventBus
.get("some_key", String.class)
.observe(this, new Observer<String>() {
@Override
public void onChanged(@Nullable String s) {
}
});
1
2
3
4
// 发送消息
LiveEventBus
.get("some_key")
.post(some_value);

其实,这三个方法就是最核心的,get、observe和post。通过get获取一个Observable对象,通过observe进行监听,通过post发送消息。我们就从这三个方法入手去分析其源码。

get方法分析

跟踪get方法,不难发现,是由LiveEventBusCore单例提供的with()方法返回的ObservableLiveEventBusCore中有一个名为bus的Map<String, LiveEvent>的成员变量,就是在这个变量中,以key - value的形式,保存了Obserable对象。observe方法与post方法都是由Obserable提供的。Observable是一个接口,它有一个唯一的实现类:LiveEvent。也就是说,observe方法与post方法的具体实现,都是由LiveEvent类提供。

主要代码如下:

##LiveEvent

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
private class LiveEvent<T> implements Observable<T> {
@NonNull
private final String key;
private final LifecycleLiveData<T> liveData; // 继承自MutableLiveData,实现生命周期感知
private final Map<Observer, ObserverWrapper<T>> observerMap = new HashMap<>(); // 存储ObserverWrapper对象
private final Handler mainHandler = new Handler(Looper.getMainLooper()); // 便于切换到主线程

/**
* 进程内发送消息
*
* @param value 发送的消息
*/
@Override
public void post(T value) {
if (ThreadUtils.isMainThread()) {
postInternal(value);
} else {
mainHandler.post(new PostValueTask(value));
}
}

/**
* 注册一个Observer,生命周期感知,自动取消订阅
*
* @param owner LifecycleOwner
* @param observer 观察者
*/
@Override
public void observe(@NonNull final LifecycleOwner owner, @NonNull final Observer<T> observer) {
if (ThreadUtils.isMainThread()) {
observeInternal(owner, observer);
} else {
mainHandler.post(new Runnable() {
@Override
public void run() {
observeInternal(owner, observer);
}
});
}
}

}

LiveEvent中通过一个成员变量Map<Observer, ObserverWrapper<T>> observerMap来存储ObserverWrapper

ObserverWrapperLiveData库中的Observer类的子类,

本文采用CC-BY-SA-3.0协议,转载请注明出处
Author: boybeak