继续RxAndroid2中的继续,第一篇与第二篇中总体说明了线程中调用的过程。本篇中我们链接一下回调到主线程中的过程。
RxAndroid2:http://blog.youkuaiyun.com/yuhaihua529/article/details/77371934
45
Observable中中just方法
public static <T> Observable<T> just(T item1, T item2, T item3, T item4, T item5) { ObjectHelper.requireNonNull(item1, "The first item is null"); ObjectHelper.requireNonNull(item2, "The second item is null"); ObjectHelper.requireNonNull(item3, "The third item is null"); ObjectHelper.requireNonNull(item4, "The fourth item is null"); ObjectHelper.requireNonNull(item5, "The fifth item is null"); return fromArray(item1, item2, item3, item4, item5); }
46
public static <T> Observable<T> fromArray(T... items) { ObjectHelper.requireNonNull(items, "items is null"); if (items.length == 0) { return empty(); } else if (items.length == 1) { return just(items[0]); } return RxJavaPlugins.onAssembly(new ObservableFromArray<T>(items)); }
47
此处贴出上一篇文章中的42个代码
public void subscribeActual(Observer<? super T> s) { ObservableSource<? extends T> pub; try { pub = ObjectHelper.requireNonNull(supplier.call(), "null ObservableSource supplied"); } catch (Throwable t) { Exceptions.throwIfFatal(t); EmptyDisposable.error(t, s); return; } pub.subscribe(s); }
pub是ObsercableFromArray类型, ObservableSource是一个接口,pub实现了这个接口。
pub.subscribe(s),其中s是创建这个
ObservableSubcribeOn.SubcribeOnObserver,
继续执行:
48
Observable中执行
public final void subscribe(Observer<? super T> observer) { ObjectHelper.requireNonNull(observer, "observer is null"); try { observer = RxJavaPlugins.onSubscribe(this, observer); ObjectHelper.requireNonNull(observer, "Plugin returned null Observer"); subscribeActual(observer); } catch (NullPointerException e) { // NOPMD throw e; } catch (Throwable e) { Exceptions.throwIfFatal(e); // can't call onError because no way to know if a Disposable has been set or not // can't call onSubscribe because the call might have set a Subscription already RxJavaPlugins.onError(e); NullPointerException npe = new NullPointerException("Actually not, but can't throw other exceptions due to RS"); npe.initCause(e); throw npe; } }
subscribeActual(observer);
49
ObservableFromArray中执行
public void subscribeActual(Observer<? super T> s) { FromArrayDisposable<T> d = new FromArrayDisposable<T>(s, array); s.onSubscribe(d); if (d.fusionMode) { return; } d.run(); }
执行d.run()
50
void run() { T[] a = array; int n = a.length; for (int i = 0; i < n && !isDisposed(); i++) { T value = a[i]; if (value == null) { actual.onError(new NullPointerException("The " + i + "th element is null")); return; } actual.onNext(value); } if (!isDisposed()) { actual.onComplete(); } }
actual=ObservableObserveOn,执行相应的方法,这个对象就是执行subscribeOn方法后返回的对象,继续执行
schedule()
ObservableObserveOn中的方法
51
void schedule() { if (getAndIncrement() == 0) { worker.schedule(this); } }
worker就是当时
schedule中执行
52
public Disposable schedule(@NonNull Runnable run) { return schedule(run, 0L, TimeUnit.NANOSECONDS); }
在HandlerScheduler.HandlerWorker中执行
53
public Disposable schedule(Runnable run, long delay, TimeUnit unit) { if (run == null) throw new NullPointerException("run == null"); if (unit == null) throw new NullPointerException("unit == null"); if (disposed) { return Disposables.disposed(); } run = RxJavaPlugins.onSchedule(run); ScheduledRunnable scheduled = new ScheduledRunnable(handler, run); Message message = Message.obtain(handler, scheduled); message.obj = this; // Used as token for batch disposal of this worker's runnables. handler.sendMessageDelayed(message, Math.max(0L, unit.toMillis(delay))); // Re-check disposed state for removing in case we were racing a call to dispose(). if (disposed) { handler.removeCallbacks(scheduled); return Disposables.disposed(); } return scheduled; }
上述代码中的run就是ObservableObserveOn.ObserveOnObserver
然后通过主线程中的Handler对象将runnable发到主线程中进行执行。
这个时候我们在回头看下上述中的observer对象的run方法
@Override public void run() { if (outputFused) { drainFused(); } else { drainNormal(); } }
执行:
void drainNormal() { int missed = 1; final SimpleQueue<T> q = queue; final Observer<? super T> a = actual; for (;;) { if (checkTerminated(done, q.isEmpty(), a)) { return; } for (;;) { boolean d = done; T v; try { v = q.poll(); } catch (Throwable ex) { Exceptions.throwIfFatal(ex); s.dispose(); q.clear(); a.onError(ex); worker.dispose(); return; } boolean empty = v == null; if (checkTerminated(d, empty, a)) { return; } if (empty) { break; } a.onNext(v); } missed = addAndGet(-missed); if (missed == 0) { break; } } }
上面的a==actual,看到actual,大家就知道了他是什么了,他是DisposableObserver对象,实现了主线程的调用。到此为止我们的代码逻辑已经熟悉完成,后面我们一起在进行一次代码实现方案的说明已经代码结构的讲解。下一篇我们在详细讲解代码结构和实现的巧妙之处。