Rxjava源碼分析之IO.Reactivex.Observable

Observable是一個non-backpressured,基於響應class的多值提供工廠方法,中間運算操作以及同步異步響應流。 它的許多操作接收ObservableSource作爲參數 (這類non-backpressured flows 基本響應接口類,Observable也實現了)。 Observable的操作默認情況下以128個元素的緩衝區運行,該大小可以通過修改系統的參數進行改變。 因爲大多數操作都能重載,所以可以顯示的設置內部的緩衝區大小。

Observable注意事項

  • 1、所有的運算符操作可能在特定計算機中無法使用運行

Observable的源碼幾千行實在是太多了,只能找幾個主要的運算符操作來源碼分析了。主要的操作運算符使用方法將進行逐步更新補充完整。

  /**
     * TODO
     * Provides an API (via a cold {@code Observable}) that bridges the reactive world with the callback-style world.
     * 提供一個API(通過冷{@code Observable}),將反應式世界與回調式世界聯繫起來。
     * <p>
     * Whenever an {@link Observer} subscribes to the returned {@code Observable},
     * the provided {@link ObservableOnSubscribe} callback is invoked with a fresh instance of an {@link ObservableEmitter}
     * that will interact only with that specific {@code Observer}.
     * 每當{@link Observer}訂閱返回的{@code Observable}時,ObservableEmitter將會
     * 調用ObservableOnSubscribe提供的回調,並且只會與特定的Observer進行互動
     * <p>
     * If this {@code Observer} disposes the flow (making {@link ObservableEmitter#isDisposed} return {@code true}),
     * 如果Observer處理了flow,使得ObservableEmitter#isDisposed=true
     * other observers subscribed to the same returned {@code Observable} are not affected.
     * 其他的observers訂閱返回來的同一個Observable將不受影響
     * <p>
     * You should call the {@code ObservableEmitter}'s {@code onNext}, {@code onError} and {@code onComplete} methods in a serialized fashion.
     * 你應該以序列化的方式調用ObservableEmitter的    onNext、onError或onComplete方法
     * The rest of its methods are thread-safe.  其他的方法是線程安全的
     * <p>
     * TODO 某些特定的計算機,Create方法不會運行
     *
     * @param source the emitter that is called when an {@code Observer} subscribes to the returned {@code Observable}
     *               當Observer訂閱返回的Observable時調用的發射器。
     */
    @CheckReturnValue
    @NonNull
    @SchedulerSupport(SchedulerSupport.NONE)
    public static <T> Observable<T> create(@NonNull ObservableOnSubscribe<T> source) {
        Objects.requireNonNull(source, "source is null");
        return RxJavaPlugins.onAssembly(new ObservableCreate<>(source));
    }

    /**
     * Returns an {@code Observable} that calls an {@link ObservableSource} factory to create an {@code ObservableSource} for each new {@link Observer}that subscribes.
     * 返回一個Observable,ObservableSource工廠方法來創建一個ObservableSource爲每一個訂閱的Observer
     * That is, for each subscriber, the actual {@code ObservableSource} that subscriber observes is determined by the factory function.
     * 也就是說對每個訂閱者來說,訂閱者的觀察的實際的ObservableSource通過工廠功能決定
     * <p>
     * The {@code defer} operator allows you to defer or delay emitting items from an {@code ObservableSource} until such time as an
     * {@code Observer} subscribes to the {@code ObservableSource}.
     * defer操作符允許你通過ObservableSource推遲或者延遲發射items,直到Observer訂閱觀察該ObservableSource
     * <p>
     * This allows an {@code Observer} to easily obtain updates or a refreshed version of the sequence.
     * 該方法允許能夠輕鬆地獲取更新或者版本刷新
     * <p>
     * TODO  同理,特定計算機該操作符無法生效
     *
     * @param supplier the {@code ObservableSource} factory function to invoke for each {@code Observer} that subscribes to the
     *                 resulting {@code Observable}
     *                 {@code ObservableSource}工廠函數,用於爲每個訂閱了*結果{@code Observable}的{@code Observer}調用
     */
    @CheckReturnValue
    @NonNull
    @SchedulerSupport(SchedulerSupport.NONE)
    public static <T> Observable<T> defer(@NonNull Supplier<? extends ObservableSource<? extends T>> supplier) {
        Objects.requireNonNull(supplier, "supplier is null");
        return RxJavaPlugins.onAssembly(new ObservableDefer<>(supplier));
    }

    /**
     * Returns an {@code Observable} that emits no items to the {@link Observer} and immediately invokes its
     * {@link Observer#onComplete onComplete} method.
     * 返回一個{@code Observable},它不會向{@link Observer}發送任何項item,並立即調用其* {@link Observer#onComplete}方法。
     * <p>
     * TODO  同理,特定計算機該操作符無法生效
     */
    @CheckReturnValue
    @SchedulerSupport(SchedulerSupport.NONE)
    @SuppressWarnings("unchecked")
    @NonNull
    public static <T> Observable<T> empty() {
        return RxJavaPlugins.onAssembly((Observable<T>) ObservableEmpty.INSTANCE);
    }

    /**
     * Returns an {@code Observable} that invokes an {@link Observer}'s {@link Observer#onError onError} method when the
     * {@code Observer} subscribes to it.
     * <p>
     * <img width="640" height="221" src="https://raw.github.com/wiki/ReactiveX/RxJava/images/rx-operators/error.supplier.png" alt="">
     * TODO  同理,特定計算機該操作符無法生效
     *
     * @param supplier a {@link Supplier} factory to return a {@link Throwable} for each individual {@code Observer}
     *                 Supplier工廠產生一個Throwable提供給每個Observer,這樣可以在OnError方法中使用
     */
    @CheckReturnValue
    @NonNull
    @SchedulerSupport(SchedulerSupport.NONE)
    public static <T> Observable<T> error(@NonNull Supplier<? extends Throwable> supplier) {
        Objects.requireNonNull(supplier, "supplier is null");
        return RxJavaPlugins.onAssembly(new ObservableError<>(supplier));
    }

該篇博客純屬個人觀點和見解,如有錯誤懇請留言指正,萬分感激!

關聯鏈接:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章