先看下类图
我们看一下它的创建:
public static <T> PublishSubject<T> create() {
return new PublishSubject<T>(new PublishSubjectState<T>());
}
创建了一个PublishSubjectState
然后看下onNext
public void onNext(T v) {
state.onNext(v);
}
public void onNext(T t) {
for (PublishSubjectProducer<T> pp : get()) {
pp.onNext(t);
}
}
这里get()返回空,直接返回
再看下subscribe,最终会调用PublishSubjectState的call函数
public void call(Subscriber<? super T> t) {
PublishSubjectProducer<T> pp = new PublishSubjectProducer<T>(this, t);
t.add(pp);
t.setProducer(pp);
if (add(pp)) {
if (pp.isUnsubscribed()) {
remove(pp);
}
} else {
Throwable ex = error;
if (ex != null) {
t.onError(ex);
} else {
t.onCompleted();
}
}
}
首先以传进来的Subscriber创建一个PublishSubjectProducer
setProducer好好没做啥事
调用add函数
boolean add(PublishSubjectProducer<T> inner) {
for (;;) {
PublishSubjectProducer<T>[] curr = get();
if (curr == TERMINATED) {
return false;
}
int n = curr.length;
@SuppressWarnings("unchecked")
PublishSubjectProducer<T>[] next = new PublishSubjectProducer[n + 1];
System.arraycopy(curr, 0, next, 0, n);
next[n] = inner;
if (compareAndSet(curr, next)) {
return true;
}
}
}
重新设置当前get()
如果在调用onNext
public void onNext(T t) {
for (PublishSubjectProducer<T> pp : get()) {
pp.onNext(t);
}
}
这里有值,调用PublishSubjectProducer的onNext
public void onNext(T t) {
long r = get();
if (r != Long.MIN_VALUE) {
long p = produced;
if (r != p) {
produced = p + 1;
actual.onNext(t);
} else {
unsubscribe();
actual.onError(new MissingBackpressureException("PublishSubject: could not emit value due to lack of requests"));
}
}
}
produced+1
调用actual的onNext,最终调用到我们回调设置的onNext