美文网首页RxJava入门到精通
Android进阶学习RxJava(三)Subscriber简略

Android进阶学习RxJava(三)Subscriber简略

作者: 郝大富 | 来源:发表于2020-10-22 13:58 被阅读0次

    先来横向对比一下

    Observer有三个方法
    • onCompleted
    • onError
    • onNext
    Subscriber 有四个方法
    • onStart(可有选择性的重写)
    • onCompleted
    • onError
    • onNext

    Action 是 RxJava 的一个接口,常用的有Action0和Action1

    Action0
    • 先上Action0源码 只有一个无参方法
    public interface Action0 extends Action {
        void call();
    }
    
    • Action0比较简单和下面一块来说
    Action1
    • 先上Action1源码
    public interface Action1<T> extends Action {
        void call(T t);
    }
    
    • 然后上关联(subscribe)源码,这个是只有onNext一个参数的重写方法
    • 其他的也类似,根据参数内部不同直接调用对应方法
    public final Subscription subscribe(final Action1<? super T> onNext) {
        if (onNext == null) {
            throw new IllegalArgumentException("onNext can not be null");
        }
        // 如果传入的Action 不为空,则进行转换,源码里进行调用onNext方法
        return subscribe(new Subscriber<T>() {
            @Override
            public final void onCompleted() {
                // do nothing
            }
            @Override
            public final void onError(Throwable e) {
                throw new OnErrorNotImplementedException(e);
            }
            @Override
            public final void onNext(T args) {
                //看这句,在这里直接调用参数onNext里Action的call方法
                onNext.call(args);
            }
        });
    }
    
    
    • 所以,源码上做了一些简写,一些情况下Action完全可以替代Subscriber,还更加灵活
    我们开始编故事(撸码)
    • 创建精简版小明(使用Action1)
    //新建Action 设置泛型为String
    Action1<String> onNextAction = new Action1<String>() {
        @Override
        public void call(String s) {
            LogUtils.e(s);
        }
    };
    //把小明和小花关联起来
    Observable.just("Hello", "World").subscribe(onNextAction);
    
    
    • 有没有感觉,代码越写越少,功能一点都没少
    到重点了
    • 看subscribe所有方法描述
      [图片上传失败...(image-e62084-1602817486806)]
    • OK 接着写
    Action1<String> onNextAction = new Action1<String>() {
        @Override
        public void call(String s) {
            LogUtils.e(s);
        }
    };
    Action1<Throwable> onErrorAction = new Action1<Throwable>() {
        @Override
        public void call(Throwable throwable) {
            LogUtils.e(throwable.getMessage());
        }
    };
    Action0 actionCompleted = new Action0() {
        @Override
        public void call() {
            LogUtils.e("Completed");
        }
    };
    
    //第一种调用形式
    Observable.just("Hello", "World").subscribe(onNextAction);
    //第二种调用形式
    Observable.just("Hello", "World").subscribe(onNextAction,onErrorAction);
    //全部调用形式
    Observable.just("Hello", "World").subscribe(onNextAction,onErrorAction,actionCompleted);
    
    

    相关文章

      网友评论

        本文标题:Android进阶学习RxJava(三)Subscriber简略

        本文链接:https://www.haomeiwen.com/subject/sxkzpktx.html