RxJava2-简单使用和源码分析

RxJava2-简单使用和源码分析

添加依赖:

implementation 'io.reactivex.rxjava2:rxjava:2.1.4'
implementation 'io.reactivex.rxjava2:rxandroid:2.0.2'

使用:

        Observable
                .create(new ObservableOnSubscribe<Integer>() {
                    @Override
                    public void subscribe(ObservableEmitter<Integer> emitter) {
                        emitter.onNext(22245);
                        emitter.onComplete();
                        Log.i("ccer", "================currentThread name: " + Thread.currentThread().getName());
                    }
                })
                .subscribe(new Observer<Integer>() {
                    @Override
                    public void onSubscribe(Disposable d) {
                        Log.i("ccer", "========================onSubscribe");
                    }

                    @Override
                    public void onNext(Integer integer) {
                        Log.i("ccer", "========================onNext");
                    }

                    @Override
                    public void onError(Throwable e) {
                        Log.i("ccer", "========================onError");
                    }

                    @Override
                    public void onComplete() {
                        Log.i("ccer", "========================onComplete");
                    }
                });
05-27 10:26:09.754 7192-7192/com.example.administrator.myapplication I/ccer: ========================onSubscribe
05-27 10:26:09.754 7192-7192/com.example.administrator.myapplication I/ccer: ========================onNext
05-27 10:26:09.754 7192-7192/com.example.administrator.myapplication I/ccer: ========================onComplete
05-27 10:26:09.754 7192-7192/com.example.administrator.myapplication I/ccer: ================currentThread name: main

原理分析

create
Observable
                .create(new ObservableOnSubscribe<Integer>() {
                    @Override
                    public void subscribe(ObservableEmitter<Integer> emitter) {
                        emitter.onNext(22245);
                        emitter.onComplete();
                        Log.i("ccer", "================currentThread name: " + Thread.currentThread().getName());
                    }
                })

首先是这一部分代码,调用了create方法,参数是ObservableOnSubscribe;

ObservableOnSubscribe
public interface ObservableOnSubscribe<T> {

    /**
     * Called for each Observer that subscribes.
     * @param emitter the safe emitter instance, never null
     * @throws Exception on error
     */
    void subscribe(@NonNull ObservableEmitter<T> emitter) throws Exception;
}

ObservableOnSubscribe是一个接口,接口方法是subscribe,里面有一个参数ObservableEmitter

ObservableEmitter
public interface ObservableEmitter<T> extends Emitter<T> {

    /**
     * Sets a Disposable on this emitter; any previous Disposable
     * or Cancellation will be unsubscribed/cancelled.
     * @param d the disposable, null is allowed
     */
    void setDisposable(@Nullable Disposable d);

    /**
     * Sets a Cancellable on this emitter; any previous Disposable
     * or Cancellation will be unsubscribed/cancelled.
     * @param c the cancellable resource, null is allowed
     */
    void setCancellable(@Nullable Cancellable c);

    /**
     * Returns true if the downstream disposed the sequence.
     * @return true if the downstream disposed the sequence
     */
    boolean isDisposed();

    /**
     * Ensures that calls to onNext, onError and onComplete are properly serialized.
     * @return the serialized ObservableEmitter
     */
    @NonNull
    ObservableEmitter<T> serialize();

    /**
     * Attempts to emit the specified {@code Throwable} error if the downstream
     * hasn't cancelled the sequence or is otherwise terminated, returning false
     * if the emission is not allowed to happen due to lifecycle restrictions.
     * <p>
     * Unlike {@link #onError(Throwable)}, the {@code RxJavaPlugins.onError} is not called
     * if the error could not be delivered.
     * @param t the throwable error to signal if possible
     * @return true if successful, false if the downstream is not able to accept further
     * events
     * @since 2.1.1 - experimental
     */
    @Experimental
    boolean tryOnError(@NonNull Throwable t);
}

这个发射器也是一个接口,继承自Emitter,先一追到底,然后反过来看。

Emitter
public interface Emitter<T> {

    /**
     * Signal a normal value.
     * @param value the value to signal, not null
     */
    void onNext(@NonNull T value);

    /**
     * Signal a Throwable exception.
     * @param error the Throwable to signal, not null
     */
    void onError(@NonNull Throwable error);

    /**
     * Signal a completion.
     */
    void onComplete();
}

发射器接口,里面的三个方法是我们常见的三个方法[onNext/onError/onComplete],一般在被观察者(Observable)中的回调去发射这三个方法(可以看看我们一开始的使用案例)
void onNext(@NonNull T value):发射事件,这个可以发射无数次;
void onError(@NonNull Throwable error):发射一个错误事件,一旦发射就没有后续发送事件的可能了,这个事件流就断了(就是发射onError之后再发射onNext是不可能了,接收不到)
void onComplete():发射一个结束事件;同理onError,而且onError和onComplete是只能发生其中的一个,因为他们都是结束事件流,谁先发射谁就是接收事件的最后一个。

发射和接收是不相关的,你可以发射N个事件,但是如果Observer已经关闭了这个流,则不管怎么发送也接收不到了

现在我们追到底了,然后回溯;ObservableEmitter继承自Emitter,在这三个方法的基础上增加了[setDisposable/setCancellable/isDisposed/serialize/tryOnError]这五个方法

setDisposable:设置一个Disposable
setCancellable:设置一个Cancelable
isDisposed:判断是否已经断流
serialize:序列化
tryOnError:

再往上追溯我们就回来了create参数那;

回顾一下:
ObservableOnSubscribe就是一个接口,接口方法中的参数是一个发射器,ObservableEmitter,他继承自Emitter,里面定义了一些发射事件,成功失败和设置流开关的一些方法。

再来看看create方法:

    @CheckReturnValue
    @SchedulerSupport(SchedulerSupport.NONE)
    public static <T> Observable<T> create(ObservableOnSubscribe<T> source) {
        ObjectHelper.requireNonNull(source, "source is null");
        return RxJavaPlugins.onAssembly(new ObservableCreate<T>(source));
    }

先是进行null判断,然后做了一个包装处理

RxJavaPlugins.onAssembly()
    /**
     * Calls the associated hook function.
     * @param <T> the value type
     * @param source the hook's input value
     * @return the value returned by the hook
     */
    @SuppressWarnings({ "rawtypes", "unchecked" })
    @NonNull
    public static <T> Observable<T> onAssembly(@NonNull Observable<T> source) {
        Function<? super Observable, ? extends Observable> f = onObservableAssembly;
        if (f != null) {
            return apply(f, source);
        }
        return source;
    }

先忽略上面的代码,就知道是直接返回这个参数,也就是ObservableCreate

ObservableCreate
public final class ObservableCreate<T> extends Observable<T> {
    final ObservableOnSubscribe<T> source;

    public ObservableCreate(ObservableOnSubscribe<T> source) {
        this.source = source;
    }

    @Override
    protected void subscribeActual(Observer<? super T> observer) {
        CreateEmitter<T> parent = new CreateEmitter<T>(observer);
        observer.onSubscribe(parent);

        try {
            source.subscribe(parent);
        } catch (Throwable ex) {
            Exceptions.throwIfFatal(ex);
            parent.onError(ex);
        }
    }
    ...
    CreateEmitter
    ...
    SerializedEmitter
    ...
}    

就当前的代码调用而言,就是ObservableCreate中有一个成员变量ObservableOnSubscribe,将传递过来的参数存储下来。然后回溯。这样create方法就结束了,至于ObservableOnSubscribe里面的subscribe方法中的调用,因为这是一个回调,所以暂时是不会触发的(你懂的)。

Observer

订阅方法subscribe,传进来的了一个Observer(观察者)参数

public interface Observer<T> {

    /**
     * Provides the Observer with the means of cancelling (disposing) the
     * connection (channel) with the Observable in both
     * synchronous (from within {@link #onNext(Object)}) and asynchronous manner.
     * @param d the Disposable instance whose {@link Disposable#dispose()} can
     * be called anytime to cancel the connection
     * @since 2.0
     */
    void onSubscribe(@NonNull Disposable d);

    /**
     * Provides the Observer with a new item to observe.
     * <p>
     * The {@link Observable} may call this method 0 or more times.
     * <p>
     * The {@code Observable} will not call this method again after it calls either {@link #onComplete} or
     * {@link #onError}.
     *
     * @param t
     *          the item emitted by the Observable
     */
    void onNext(@NonNull T t);

    /**
     * Notifies the Observer that the {@link Observable} has experienced an error condition.
     * <p>
     * If the {@link Observable} calls this method, it will not thereafter call {@link #onNext} or
     * {@link #onComplete}.
     *
     * @param e
     *          the exception encountered by the Observable
     */
    void onError(@NonNull Throwable e);

    /**
     * Notifies the Observer that the {@link Observable} has finished sending push-based notifications.
     * <p>
     * The {@link Observable} will not call this method if it calls {@link #onError}.
     */
    void onComplete();
}

四个方法,是不是和发射器的那三个方法很像,基本就对应着回调,就是代理模式。
void onSubscribe(@NonNull Disposable d);这个方法则是一个用于性能优化的方法,可以用来断流。

回溯看看订阅方法subscribe

subscribe
    @SchedulerSupport(SchedulerSupport.NONE)
    @Override
    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;
        }
    }

一开始是个空检查,中间也有一些空检查和异常处理,总结就两行调用

observer = RxJavaPlugins.onSubscribe(this, observer);

subscribeActual(observer);
RxJavaPlugins.onSubscribe(this, observer)
    /**
     * Calls the associated hook function.
     * @param <T> the value type
     * @param source the hook's input value
     * @param observer the observer
     * @return the value returned by the hook
     */
    @SuppressWarnings({ "rawtypes", "unchecked" })
    @NonNull
    public static <T> Observer<? super T> onSubscribe(@NonNull Observable<T> source, @NonNull Observer<? super T> observer) {
        BiFunction<? super Observable, ? super Observer, ? extends Observer> f = onObservableSubscribe;
        if (f != null) {
            return apply(f, source, observer);
        }
        return observer;
    }

这个和之前的create方法中的RxJavaPlugins.onAssembly()差不多,忽略一些代码后就直接返回了一个Observer;
然后调用了subscribeActual方法,他是一个抽象方法;我们目前处在Observable中,他的实现类是我们之前在create中RxJavaPlugins.onAssembly()中创建的ObservableCreate对象,我们就去看看这个方法

subscribeActual
    @Override
    protected void subscribeActual(Observer<? super T> observer) {
        CreateEmitter<T> parent = new CreateEmitter<T>(observer);
        observer.onSubscribe(parent);

        try {
            source.subscribe(parent);
        } catch (Throwable ex) {
            Exceptions.throwIfFatal(ex);
            parent.onError(ex);
        }
    }

创建一个发射器CreateEmitter

static final class CreateEmitter<T>
    extends AtomicReference<Disposable>
    implements ObservableEmitter<T>, Disposable {


        private static final long serialVersionUID = -3434801548987643227L;

        final Observer<? super T> observer;

        CreateEmitter(Observer<? super T> observer) {
            this.observer = observer;
        }

        @Override
        public void onNext(T t) {
            if (t == null) {
                onError(new NullPointerException("onNext called with null. Null values are generally not allowed in 2.x operators and sources."));
                return;
            }
            if (!isDisposed()) {
                observer.onNext(t);
            }
        }

        @Override
        public void onError(Throwable t) {
            if (!tryOnError(t)) {
                RxJavaPlugins.onError(t);
            }
        }

        @Override
        public boolean tryOnError(Throwable t) {
            if (t == null) {
                t = new NullPointerException("onError called with null. Null values are generally not allowed in 2.x operators and sources.");
            }
            if (!isDisposed()) {
                try {
                    observer.onError(t);
                } finally {
                    dispose();
                }
                return true;
            }
            return false;
        }

        @Override
        public void onComplete() {
            if (!isDisposed()) {
                try {
                    observer.onComplete();
                } finally {
                    dispose();
                }
            }
        }

        @Override
        public void setDisposable(Disposable d) {
            DisposableHelper.set(this, d);
        }

        @Override
        public void setCancellable(Cancellable c) {
            setDisposable(new CancellableDisposable(c));
        }

        @Override
        public ObservableEmitter<T> serialize() {
            return new SerializedEmitter<T>(this);
        }

        @Override
        public void dispose() {
            DisposableHelper.dispose(this);
        }

        @Override
        public boolean isDisposed() {
            return DisposableHelper.isDisposed(get());
        }
    }

继承自AtomicReference(这个我也不清楚),实现了ObservableEmitter和Disposable接口,

/**
 * Represents a disposable resource.
 */
public interface Disposable {
    /**
     * Dispose the resource, the operation should be idempotent.
     */
    void dispose();

    /**
     * Returns true if this resource has been disposed.
     * @return true if this resource has been disposed
     */
    boolean isDisposed();
}

上面两个接口中的方法,我们应该熟悉;
ObservableEmitter是继承自Emitter实现了三个基本方法并且增加关于事件流和序列化以及Cancelable方法。
CreateEmitter相对于Observer就是一个代理类,在subscribeActual方法中,将我们传进来的Observer通过CreateEmitter进行了代理。

发射器构架好了,然后调用了Observer中的onSubscribe方法,这样可以在发射事件之前拿到事件源,这样就可以随时断流。

然后调用我们一开始create的回调subscribe,在这里面我们进行事件发射,这样整个事件流就发射出去了。

这里还可以看到,onComplete和onError方法是我们手动调用触发,不会自动触发,只有在发射事件的时候遇到不可抗力(int i=1/0;)时,才会try-catch中调用onError.

回顾一下:
订阅的时候,我们传入一个Observer,并实现了他的四个方法,然后将Observer通过CreateEmitter包装代理,调用Observer的onSubscribe方法,获取到事件源;最后调用subscribe(这个方法名不知道为什么要这么起名字,之前叫做call不是挺好的嘛)方法发射事件。

整个回顾一下:
Observable通过静态方法create创建一个被观察者Observable,是怎么创建的呢,在create中传入了一个ObservableOnSubscribe参数(他是只有一个接口方法subscribe的接口,而且这个接口方法的参数是一个发射器ObservableEmitter,继承自Emitter,有一些常规的方法以及对Observer的代理调用),在create方法内部创建一个ObservableCreate对象,他是Observable的子类,构造内部对ObservableOnSubscribe进行了保存,然后通过RxJavaPlugins.onAssembly进行返回一个Observable。
然后就是订阅方法,在订阅方法中传入了一个Observer的实现类,并通过ObservableEmitter进行了包装代理,先调用了onSubscribe方法获取到事件源,也就是发射器(CreateEmitter实现了Disposable),最后调用之前在create中传进来的ObservableOnSubscribe的subscribe进行回调发射事件,触发Observer中的方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: RxJava和Retrofit是一种经常结合使用的技术,主要是因为它们都能够协同工作,优化Android应用的性能。 具体而言,RxJava是一种响应式编程框架,可以通过异步数据流的方式处理数据。Retrofit则是一个RESTful框架,用于与服务器交互。因此,RxJava可以被用于处理从Retrofit返回的数据流。 这两个框架的结合使用可以让Android应用更快地处理数据并更好地应对网络请求。同时,通过使用RxJava的转换操作符,我们可以将从Retrofit返回的数据进行快速处理和转换。 ### 回答2: RXJava是一个响应式编程库,而Retrofit则是针对REST API进行网络请求和响应解析的框架。这两者结合使用,可以实现优雅的网络请求,并让代码更加简洁易懂。 Retrofit默认使用的是同步方法,这意味着如果在主线程中执行网络请求,就会阻塞主线程,造成卡顿甚至应用崩溃。为了避免这种情况,我们可以使用RXJava中的异步调度器,将网络请求放在IO线程中执行,并在请求完成后将结果回调到主线程中处理,保证应用的流畅性和响应性。 RXJava还提供了丰富的操作符,如map、filter、flatMap等,能够对网络请求的响应数据进行快速处理和转换,将数据转换成我们需要的格式,例如对象或列表。这样在显示数据时,可以节省大量的代码和时间。 另外,由于网络请求可能出现异常、网络超时等情况,我们需要对这些异常情况进行处理。RXJava提供了专门的异常处理操作符,如onErrorReturn、onErrorResumeNext等,能够快速捕获和处理网络请求异常,并在发生异常时执行相应的操作。 综上所述,RXJava和Retrofit的结合使用,能够方便地实现优雅的网络请求和数据处理,以及有效地解决网络请求可能出现的异常情况,为开发者提供了更加便捷、高效、安全的开发体验。 ### 回答3: RxJava和Retrofit是目前Android开发中非常流行的两个库。他们都不是新兴的库,RxJava是由Netflix公司开发的响应式编程库,是在Java Future的基础上进行开发的。Retrofit是由Square公司开发的网络请求库。在进行Android开发时,我们一般会经常使用Retrofit来完成网络请求的操作,而配合使用RxJava可以让我们更加方便的处理网络请求的结果。 为什么要使用RxJava和Retrofit? Retrofit是一个基于OkHttp的RESTful API请求框架,可以让我们通过定义相应的接口,来进行网络请求,使用简单而且很快,这也是为什么它会被Android开发者广泛使用的原因。而RxJava则是将异步事件组合在一起的响应式编程库,可以让我们以响应式的方式来处理网络请求的结果。因此,当我们结合使用这两个库时,就可以更加高效地完成Android的开发。 如何使用RxJava和Retrofit? 使用RxJava和Retrofit大致的流程如下: 1. 在build.gradle文件中添加Retrofit和RxJava的依赖: ``` implementation 'com.squareup.retrofit2:retrofit:2.9.0' implementation 'com.squareup.retrofit2:converter-gson:2.9.0' implementation 'io.reactivex.rxjava2:rxjava:2.2.19' implementation 'io.reactivex.rxjava2:rxandroid:2.1.1' ``` 2. 定义Retrofit接口: ``` public interface ApiService { @GET("users") Observable<List<User>> getUsers(); } ``` 3. 使用Retrofit和RxJava进行网络请求: ``` ApiService apiService = RetrofitClient.getInstance().create(ApiService.class); apiService.getUsers() .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Observer<List<User>>() { @Override public void onSubscribe(Disposable d) { } @Override public void onNext(List<User> users) { // 成功获取到用户列表 } @Override public void onError(Throwable e) { // 网络请求失败 } @Override public void onComplete() { } }); ``` 在这个示例中,我们首先定义了一个ApiService接口,其中包含了我们需要进行网络请求的方法。在进行网络请求时,我们可以使用Retrofit的create()方法来实例化一个ApiService对象,然后使用subscribeOn()和observeOn()方法进行线程调度,最后使用subscribe()方法订阅Observer对象,即可完成网络请求的操作。 结论 RxJava和Retrofit可以很好地配合使用,使我们可以简洁、高效地处理网络请求的结果。配合使用可以大大提高我们的开发效率,同时也可以减少我们的代码量,让我们可以更加专注于业务逻辑的实现。因此,在进行Android开发时,建议使用这两个库来完成网络请求的操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值