手写RxJava(一)

488 阅读3分钟

一、手写RxJava

1.链式逻辑简洁

RxJava 的Create原理就像一场宇航员登月计划一样

1.宇航员进入火箭进行倒数,OnSubscribe: 订阅成功即将开始发送
2.宇航员倒数结束进行点火升空,subscribe: 开始发射
3.宇航员的火箭分离,onNext: 进行接收 
4.宇航员进入太空轨道,onComplete: 接收事件完成 

代码示例(RxJava使用例子):

 Observable.create(new ObservableOnSubscribe<Integer>() {
         @Override
         public void subscribe(Observer<Integer> observableEmitter) {
             Log.i(TAG, "2.宇航员倒数结束进行点火升空,subscribe: 开始发射");
             observableEmitter.onNext(123);
             observableEmitter.onComplete();
         }


     }).subscribe(new Observer<Integer>() {
         @Override
         public void onSubscribe() {
             Log.i(TAG, "1.宇航员进入火箭进行倒数,OnSubscribe: 订阅成功即将开始发送");

         }

         @Override
         public void onNext(Integer item) {
             Log.i(TAG, "3.宇航员的火箭分离,onNext: 进行接收 ");
         }

         @Override
         public void onError(Throwable e) {
             Log.d(TAG, "onError: ");
         }

         @Override
         public void onComplete() {
             Log.i(TAG, "4.宇航员进入太空轨道登录月球,onComplete: 接收事件完成 ");
         }
     });

2. RxJava实现原理

定义、订阅、发射

定义 : create 定义ObservableOnSubscribe source返回Observable对象

订阅 : 后面subscribe进行调用开始订阅,

发射 : ObservableOnSubscribe 的 subscribe Observer 进行发射.


接下来这里介绍3种操作符:Create、Just、Map 如何实现。

2.1 Create


如何实现这种完美的链式结构 create 实现?

就是要把所有的控制权交给对象Observable掌控.


Observable 代码实现:

public  class Observable<T> {
    ObservableOnSubscribe source;

    private Observable(ObservableOnSubscribe<T> source) {
        this.source = source;
    }


    public static <T> Observable<T> create(ObservableOnSubscribe<T> source) {
            return new Observable<T>(source) ;
    }
    
    
       public void subscribe(Observer<T> observer) {
            observer.onSubscribe();
            source.subscribe( observer);
    }
 }

注意: 这里面使用了泛型,增加Observable扩展性


2.2 just 实现

just 操作符内嵌发射台.

使用示例:

        Observable.just("abc").subscribe(new Observer<String>() {
            @Override
            public void onSubscribe() {
                Log.i(TAG, "onSubscribe ");

            }

            @Override
            public void onNext(String item) {
                Log.i(TAG, "onNext "+item);

            }

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

            }

            @Override
            public void onComplete() {
                Log.i(TAG, "onComplete ");

            }
        });

可以发现发射ObservableOnSubscribe 的 subscribe Observer不见了,那是因为在定义just方法里面进行发射了.(内嵌发射台)

手写代码示例:

    public static <T> Observable<T> just(final T... t) {
        ObservableOnSubscribe onSubscribe= new ObservableOnSubscribe<T>() {
            @Override
            public void subscribe(Observer<T> observableEmitter) {

                    for (T t1:t) {
                    observableEmitter.onNext(t1);
                }
                 observableEmitter.onComplete();

            }
        };

        return new Observable<T>(onSubscribe) ;
    }

2.3 map 实现

实现原理:

map 操作符关键在于转换,即如何传入函数 Function 的apply,把发射的内容进行转换再调用onNext进行接收.

解决方案:引入ObservableMap 和MapObserver 把原来的控制权抢过来


map 使用示例代码:

  Observable.create(new ObservableOnSubscribe<String>() {
                      @Override
          public void subscribe(Observer<String> observableEmitter) {
              Log.i(TAG, "宇航员倒数结束进行点火升空,subscribe: 开始发射");
              observableEmitter.onNext("123123213");
              observableEmitter.onComplete();
          }


      }).map(new Function<String, Integer>() {
      @Override
      public Integer apply(String s) throws Throwable {
          Log.i(TAG, "apply");
          int a = s.length();
          Object object= new Object() ;
          return a;
      }
  }).subscribe(new Observer<Integer>() {
      @Override
      public void onSubscribe() {
          Log.i(TAG, "onSubscribe");

      }

      @Override
      public void onNext(Integer item) {
          Log.i(TAG, "onNext "+item);

      }

      @Override
      public void onError(Throwable e) {

      }

      @Override
      public void onComplete() {
          Log.i(TAG, "onComplete");

      }
  });

手写示例代码:map函数定义

    
    //? super 可写 |? extends 可读
    public  <R> Observable<R> map(Function<? super T, ? extends R>  function){
          //  ObservableMap map = new ObservableMap(source,function);
        ObservableMap<T, R> observableMap = new ObservableMap(source, function); // source 控制权

        return new Observable<R>(observableMap); // observableMap是source的实现类
        //return new Observable(map) ;
    }

手写示例代码:ObservableMap和MapObserver定义

public class ObservableMap<T,R> implements ObservableOnSubscribe<R> {

    ObservableOnSubscribe<T> source;

    Function<T,R> function;

    Observer<R> observableEmitter;

    public ObservableMap(ObservableOnSubscribe source, Function<T,R> function) {
        this.source = source;
        this.function = function;
    }



    @Override
    public void subscribe(Observer<R> observableEmitter) {
        this.observableEmitter = observableEmitter;

        // source.subscribe(observableEmitter); // 不应该把下一层Observer交出去 ---》 上一层, 如果交出去了,map没有控制权

        MapObserver<T> mapObserver = new MapObserver(observableEmitter, source, function);

        source.subscribe(mapObserver); // 把我们自己 map MapObserver 交出去了

    }

    class MapObserver<T> implements  Observer<T>{
        ObservableOnSubscribe source;

        Function<T,R> function;

        Observer<R>  observableEmitter;

        public MapObserver(Observer<R>  observableEmitter, ObservableOnSubscribe source, Function<T, R> function) {
            this.observableEmitter = observableEmitter;
            this.function =function;
            this.source=source;
        }

        @Override
        public void onSubscribe() {
            observableEmitter.onSubscribe();
        }

        @Override
        public void onNext(T item) {
            try {
               R r=  function.apply(item);

                observableEmitter.onNext(r);

            } catch (Throwable throwable) {
                throwable.printStackTrace();
                observableEmitter.onError(throwable);

            }
        }

        @Override
        public void onError(Throwable e) {
            observableEmitter.onError(e);
        }

        @Override
        public void onComplete() {
            observableEmitter.onComplete();
        }
    }
}


有关的泛型通配符