初学者的RxJava2.0教程

初学者的RxJava2.0教程

我以前很怕麻烦,一般不喜欢做笔记。因为RXjava2.0以前看过,等过了一段时间再看,就觉得比较陌生了,基于这个原因,想用文档记录一下,方便记忆。还有一方面做个分享,希望可以帮助有需要的人。如果有不对的地方希望大家指出来,我再完善文档。

内容

我主要从源码来分析,帮助大家理解Rxjava2.0:

1.分析最简单的Observable-subscribe订阅关系;
2. 分析Observable-map-subscribeOn-subscribe订阅关系,主要是线程的切换;
3. 分析Observable-map-observeOn-subscribe订阅关系,主要是线程的切换;

开始分析代码了,希望大家不要觉得无聊

在这里插入图片描述

所有详解都在源码中注释了,请大家一定注意代码中的注释

RxJava 有以下三个基本的元素:

  • 被观察者(Observable)
  • 观察者(Observer)
  • 订阅(subscribe)

分析Observable-subscribe的关系

  • RxJava通常使用的链式调用:
 Observable.create(new ObservableOnSubscribe<String>() {
    @Override
     public void subscribe(ObservableEmitter<String> e) throws Exception {
        Log.i("RxjavaSourceDemo", "subscribe" + "---"+Thread.currentThread());
             e.onNext("我今晚吃鸡");
                  }
          })
            .subscribe(new Observer<String>() {
             @Override
             public void onSubscribe(Disposable d) {
             Log.i("RxjavaSourceDemo", "onSubscribe" + "---"+Thread.currentThread());
             }
             @Override
             public void onNext(String value) {
             Log.i("RxjavaSourceDemo", "onNext" + "---" + value+"-----"+Thread.currentThread());
             }
             @Override
             public void onError(Throwable e) {
              Log.i("RxjavaSourceDemo", "onError" + "-----"+Thread.currentThread());
             }
             @Override
             public void onComplete() {
             Log.i("RxjavaSourceDemo", "onComplete" + "---" +Thread.currentThread());
            }
        });
  • 运行结果
I/RxjavaSourceDemo: onSubscribe---Thread[main,5,main]
I/RxjavaSourceDemo: subscribe---Thread[main,5,main]
I/RxjavaSourceDemo: onNext---我今晚吃鸡-----Thread[main,5,main]

下面为了便于大家理解,我将上述的链式demo分成3个模块,来说说以上三者是如何协作的:

  • 源码流程(代码的讲解,请看注释):

1. 创建被观察者:

//observable :被观察者
 Observable<String> observable = Observable.create(new ObservableOnSubscribe<String>() {
           @Override
           public void subscribe(ObservableEmitter<String> e) throws Exception {
               Log.i("RxjavaSourceDemo", "subscribe" + "---" + Thread.currentThread());
               e.onNext("我今晚吃鸡");
           }
       });
  • Observable.create(new ObservableOnSubscribe() {…}的源码内容:
/**
 * Observable.create(new ObservableOnSubscribe<String>() {
 * @Override
 * public void subscribe(ObservableEmitter<String> e) throws Exception {
 * Log.i("RxjavaSourceDemo", "subscribe" + "---"+Thread.currentThread());
 * e.onNext("我今晚吃鸡");
 *    }
 * })
 * @param source=new ObservableOnSubscribe<String>() {...}
 */
 @SchedulerSupport(SchedulerSupport.NONE)
   public static <T> Observable<T> create(ObservableOnSubscribe<T> source) {
       //强调source不能为空
       ObjectHelper.requireNonNull(source, "source is null");
       //create(ObservableOnSubscribe<T> source)方法返回的结果是RxJavaPlugins.onAssembly()方法生成的
       return RxJavaPlugins.onAssembly(new ObservableCreate<T>(source));
   }
  • RxJavaPlugins.onAssembly(new ObservableCreate(source))的源码内容:
 public static <T> Observable<T> onAssembly(Observable<T> source) {
 //onObservableAssembly由setOnObservableAssembly(null)得到的,
 //所以onObservableAssembly=null
       Function<Observable, Observable> f = onObservableAssembly;
       if (f != null) {
           return apply(f, source);
       }
       //返回的就是传进来的source,source=new ObservableCreate<T>(source);
       return source;
   }

-结果 Observable.create(new ObservableOnSubscribe() {}返回的就是的
new ObservableCreate(source)对象,所以被观察者observable 就是new ObservableCreate(source)对象

2.创建观察者:

//observer :观察者
  Observer<String> observer = new Observer<String>() {
           @Override
           public void onSubscribe(Disposable d) {
               Log.i("RxjavaSourceDemo", "onSubscribe" + "---" + Thread.currentThread());
           }

           @Override
           public void onNext(String value) {
               Log.i("RxjavaSourceDemo", "onNext" + "---" + value + "-----" + Thread.currentThread());
           }

           @Override
           public void onError(Throwable e) {
               Log.i("RxjavaSourceDemo", "onError" + "-----" + Thread.currentThread());
           }

           @Override
           public void onComplete() {
               Log.i("RxjavaSourceDemo", "onComplete" + "---" + Thread.currentThread());
           }
       };

3.订阅

observable.subscribe(observer);
  • 订阅Observable .subscribe(new Observer() {})的源码分析内容
/**
 *  订阅
 *  new ObservableCreate<T>(source){}.subscribe(new Observer<String>() {
 *  @Override
 *  public void onSubscribe(Disposable d) {
 *  Log.i("RxjavaSourceDemo", "onSubscribe" + "---"+Thread.currentThread());
 *  }
 *  @Override
 *  public void onNext(String value) {
 *  Log.i("RxjavaSourceDemo", "onNext" + "---" + value+"-----"+Thread.currentThread());
 *   }
 *  @Override
 *  public void onError(Throwable e) {
 *  Log.i("RxjavaSourceDemo", "onError" + "-----"+Thread.currentThread());
 *   }
 *  @Override
 *  public void onComplete() {
 *  Log.i("RxjavaSourceDemo", "onComplete" + "---" +Thread.currentThread());
 *   }
 *  });
 * @param observer =new Observer<String>() {...}对象
 */
@SchedulerSupport(SchedulerSupport.NONE)
@Override
   public final void subscribe(Observer<? super T> observer) {
       ObjectHelper.requireNonNull(observer, "observer is null");
       try {
           //RxJavaPlugins.onSubscribe(this, observer)得到的就是观察者observer
           observer = RxJavaPlugins.onSubscribe(this, observer);
   		   //检测观察者不为null
           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)的源码分析内容(主要的逻辑
/**
* 是个抽象方法,但是由上可以被观察者是由于new ObservableCreate<T>(source)生成的
* 所以实现类是ObservableCreate
**/
 protected abstract void subscribeActual(Observer<? super T> observer);
  • ObservableCreate类中的方法就是整个Observable-subscribe的具体实现逻辑了,请关注subscribeActual实现方法和传进来的被观察者和观察者引用之间的调用关系
public final class ObservableCreate<T> extends Observable<T> {
  final ObservableOnSubscribe<T> source;
  /**
  * source被观察者,就是通过public static  <T>Observable<T>create(ObservableOnSubscribe<T>source) {...}
  *的source对象
  */
  public ObservableCreate(ObservableOnSubscribe<T> source) {
   //获得被观察者引用
      this.source = source;
  }
/**
*subscribeActual的具体实现逻辑,这里就是实现观察者与被观察者直接的调用逻辑
*@param observer观察者
*/
  @Override
  protected void subscribeActual(Observer<? super T> observer) {
     //CreateEmitter 发射器,获得了观察者引用
      CreateEmitter<T> parent = new CreateEmitter<T>(observer);
      //调用了观察者实现类中的 public void onSubscribe(Disposable d) {}方法
      observer.onSubscribe(parent);

      try {
    /**
     * source是被观察者,source=new ObservableOnSubscribe<String>() {...},
     * Observable.create(new ObservableOnSubscribe<String>() {
     * @Override
     * public void subscribe(ObservableEmitter<String> e) throws Exception {
     * Log.i("RxjavaSourceDemo", "subscribe" + "---"+Thread.currentThread());
     * e.onNext("我今晚吃鸡");
     * }
     * })所以调用了subscribe(ObservableEmitter<String> e)方法
     * ,然后 e.onNext("我今晚吃鸡")=new CreateEmitter<T>(observer).onNext(T t),
     * @param Tt=“我今晚吃鸡”
     */
          source.subscribe(parent);
      } catch (Throwable ex) {
          Exceptions.throwIfFatal(ex);
          parent.onError(ex);
      }
  }
//发射器的实现类
  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;
      }

 /**
  * 被观察者中实现的方法,下面onNext(T t)就是e.onNext("我今晚吃鸡")这句代码给调用的
  */
      @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是观察者,就是new Observer<String>() {...}对象
   *     observer.onNext(t)代码实现的就是  .subscribe(new Observer<String>() {
   *     @Override
   *     public void onSubscribe(Disposable d) {
   *     Log.i("RxjavaSourceDemo", "onSubscribe" + "---"+Thread.currentThread());
   *  }
   *  	@Override
   *   	public void onNext(String value) {
   *   	Log.i("RxjavaSourceDemo", "onNext" + "---" + value+"-----"+Thread.currentThread());
   *  }
   *  	@Override
   * 		public void onError(Throwable e) {
   *   	Log.i("RxjavaSourceDemo", "onError" + "-----"+Thread.currentThread());
   *   }
   *  	@Override
   *  	public void onComplete() {
   *  	Log.i("RxjavaSourceDemo", "onComplete" + "---" +Thread.currentThread());
   * 	}
   * });
   *    中的  public void onNext(String value) {...}这句代码
   */
   
              observer.onNext(t);
          }
      }

      @Override
      public void onError(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 {
              //如上面解释,实现的是.subscribe({...})中内部类中的onError()方法
                  observer.onError(t);
              } finally {
                  dispose();
              }
          } else {
            //如上面解释,实现的是.subscribe({})中内部类中的方法
              RxJavaPlugins.onError(t);
          }
      }

      @Override
      public void onComplete() {
          if (!isDisposed()) {
              try {
                //如上面解释,实现的是.subscribe({...})中内部类中的onComplete()方法
                  observer.onComplete();
              } finally {
                  dispose();
              }
          }
      }


一张以上流程的简单流程图

在这里插入图片描述

  • 还有2,3两点还没来得及编写,因为文档的格式写的太麻烦了,太耗时了,我有时间一一补齐
    以上是自己看源码的,根据自己的理解编写的,如有不对的地方,欢迎大家指出,谢谢!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值