RxJava2(四)创建操作符

创建被观察者的操作符
创建操作符:

private void RxJava2() {

        ObservableSource<T> :Observable数据;
        Ierable<T>  :集合;
        Array[]  :数组;
        Fruture<T> :有返回值的Callable;
        Callback : 线程;

        //从头开始创建一个ObserVable
        Observable.create(ObservableOnSubscribe < T >);

        //只发射第一个发射数据的Observable的全部数据,其他被忽略.包括onError,onComplete
        Observable.amb(Iterable < ObservableSource < T >> sources);
        Observable.ambArray(ObservableSource < T >[]sources);

        //当其中一个Observable发射了数据,通过Function组合每个Observable最新发射的一个数据,然后发射这个组合。
        Observable.combineLatest(ObservableSource < T >[]sources, Function < T, R > func);
        Observable.combineLatest(ObservableSource < T >[]sources, Function < T, R > func,
        int bufferSize);
        Observable.combineLatest(Iterable < ObservableSource < T >> sources, Function < T, R > func);
        Observable.combineLatest(Iterable < ObservableSource < T >> sources, Function < T, R > func,
        int bufferSize);
        Observable.combineLatest(ObservableSource < T1 > source1, ObservableSource < T2 > source2, BiFunction < T1, T2, R > bifunc);
        //若有异常,延迟它,知道正确的数据发射完成再发射异常。
        Observable.combineLatestDelayError(ObservableSource < T >[]sources, Function < T, R > func);
        Observable.combineLatestDelayError(ObservableSource < T >[]sources, Function < T, R > func,
        int bufferSize);
        Observable.combineLatestDelayError(Iterable < ObservableSource < T >> sources, Function < T, R > func);
        Observable.combineLatestDelayError(Iterable < ObservableSource < T >> sources, Function < T, R > func,
        int bufferSize);

        //按顺序链接多个Observable的数据
        Observable.concat(Iterable < ObservableSource < T >> sources);
        Observable.concatDelayError(Iterable < ObservableSource < T >> sources);
        Observable.concatArray(ObservableSource < T >[]);
        Observable.concatArrayDelayError(ObservableSource < >[]);
        Observable.concatEager(Iterable < ObservableSource < T >> sources);
        Observable.concatEager(ObservableSource < T >[]);
        Observable.concatArrayEager();
        Observable.concatArrayEagerDelayError();

        //一直等待,直到有订阅者,才为每一个订阅者单独创建一个新的Observable,以便包含最新数据
        Observable.defer(Callback < ? extends ObservableSource<? extends T>>callback);

        //发射一个空值
        Observable.empty();
        //不发射值
        Observable.never();
        //发射一个异常
        Observable.error(Throwable throwable);
        Observable.error(Callback < Throwable >);

        //以Iterable,Array,Future,Callable,Publisher为数据来源创建Observable
        Observable.fromIterable(Ierable < T >);
        Observable.fromArray(Array[]);
        //从Fruture的Callable获取数据
        Observable.fromFuture(Fruture < T > frature);
        Observable.fromFuture(Fruture < T > frature, Scheduler scheduler);
        Observable.fromFuture(Fruture < T > frature, long timeout,,TimeUnit unit);
        Observable.fromFuture(Fruture < T > frature, long timeout,,TimeUnit unit, Scheduler
        scheduler);
        Observable.fromCallable(Callback < T > callback);
        //从响应式数据流获取要发射的数据
        Observable.fromPublisher(Publisher < T > publisher);

        //create 每次可以发射多个事件,而 generate 是每次只能发送一个
        //一次连续发射 onNext 和 onComplete/onError 是可以的。如果连续调用多次 onNext 就崩溃了。
        Observable.generate(Consumer < Emitter < T >> generater);
        //initialState表示一个状态,状态不变,不停的发射不停的接收[generate](https://cloud.tencent.com/developer/article/1334651)
        Observable.generate(Callback < S > initialState, BiConsumer < S, Emitter < T >> generater);
      
        //按固定时间间隔发射一个从0开始无限递增的整数序列,制定调度器
        Observable.interval( long peroid, TimeUnit unit);
        Observable.interval( long peroid, TimeUnit unit, Scheduler scheduler);
        //初始延迟initialDely
        Observable.interval( long initialDely, long peroid, TimeUnit unit);
        Observable.interval( long initialDely, long peroid, TimeUnit unit, Scheduler scheduler);

        //创建一个起始值start,发射count次,initialDely,发射周期peroid的Observable
        Observable.intervalRange( long start, long count, long initialDely, long peroid, TimeUnit
        unit);
        Observable.intervalRange( long start, long count, long initialDely, long peroid, TimeUnit
        unit, Scheduler scheduler);

        //将最多4个Obserable发射数据组合成一个,3个重载,参数为1个2个3个
        Observable.merge(Iterable < ObservableSource < T >> sources, int maxCurrentcy,
        int bufferSize);
        Observable.merge(ObservableSource < T >[],int maxCurrentcy, int bufferSize);
        Observable.mergeDelayError(Iterable < ObservableSource < T >> sources, int maxCurrentcy,
        int bufferSize);
        Observable.mergeDelayError(ObservableSource < T >[],int maxCurrentcy, int bufferSize)
        //3个重载,参数为1个2个3个
        Observable.mergeArray( int maxCurrentcy, int bufferSize, ObservableSource<T >[]);
        Observable.mergeArrayDelayError( int maxCurrentcy, int bufferSize, ObservableSource<T >[]);

        //创建一个发射指定值的Observable
        Observable.just(Object item,...);

        //创建一个给定初始整数值start,发射count次,每次start++的Observable
        Observable.range( int start, int count);
        Observable.rangeLong( long start, long count);

        //判断两个Observable是否具有相同的数据序列(相同的数据,顺序,终止状态)
        Observable.sequenceEqual(ObservableSource < T1 > source1, ObservableSource < T2 > source2);
        Observable.sequenceEqual(ObservableSource < T1 > source1, ObservableSource < T2 > source2,
        int bufferSize);
        Observable.sequenceEqual(ObservableSource < T1 > source1, ObservableSource < T2 > source2, BiFunction < T1, T2, R > bifunc);
        Observable.sequenceEqual(ObservableSource < T1 > source1, ObservableSource < T2 > source2, BiPredicate < T1, T2 > biPredicate);

        Observable.switchOnNext(Iterable < ObservableSource < T >> sources);
        Observable.switchOnNext(ObservableSource < ObservableSource < T >> [],int bufferSize)
        Observable.switchOnNextDelayError(ObservableSource < ObservableSource < T >> sources);

        //创建一个在给定的延时之后发射数据项为0的Observable<Long>,指定调度器
        Observable.timer( long delay, TimeUnit unit);
        Observable.timer( long delay, TimeUnit unit, Scheduler scheduler);

        //创建一个只在Observable生命周期存在的资源,当Observable终止时这个资源会被自动释放。创建资源,Observable,释放资源
        Observable.using(
                Callback <D> resourceSupplier, Function < D, ObservableSource < T >> sourceSupplier,Consumer<T> dispose);

        Observable.wrap(ObservableSource < ? extends T > source);

        //按顺序依次组合多个Observable的数据项应用一个函数,直到数据项最少的那个Observable用完数据项为止不再组合,然后发射组合项
        Observable.zip(Iterable < ObservableSource < T >> sources, Function < T, R >);
        Observable.zip(ObservableSource < ObservableSource < T >> sources);
        Observable.zipArray(Function < Object[],R >,boolean delayError,
        int bufferSize, ObservableSource<? extends T >);
        Observable.zipIterable(Iterable < ObservableSource < T >> sources, Function < Object[],R >,
        boolean delayError, int bufferSize);
    }


1.create 从头开始创建一个ObserVable。

        //创建被观察者
        Observable.create(new ObservableOnSubscribe<String>() {
            @Override
            public void subscribe(ObservableEmitter<String> emitter) {
                //发射数据,先检查订阅者是否取消订阅
                if (!emitter.isDisposed()){
                    emitter.onNext("Hello World");
                }
                emitter.onComplete();
            }
            //订阅给观察者,接收数据
        }).subscribe(new Consumer<String>() {
            @Override
            public void accept(@NonNull String s) throws Exception {
                Log.d(TAG, "accept: onNext = " + s);
                Toast.makeText(MainActivity.this, s, Toast.LENGTH_SHORT).show();
            }
            //错误
        }, new Consumer<Throwable>() {
            @Override
            public void accept(Throwable throwable) throws Exception {
                Log.d(TAG, "accept: onError = " + throwable.getMessage());
            }
            //执行完成
        }, new Action() {
            @Override
            public void run() throws Exception {
                Log.d(TAG, "run: onComplete");
            }
        });



2.just 创建一个发射指定值的Observable。

        //创建被观察者
        Observable.just("qwe","asd","zxc")
                .subscribe(new Consumer<String>() {
                    @Override
                    public void accept(@NonNull String s) throws Exception {
                        Log.d(TAG, "accept: onNext = " + s);
                        Toast.makeText(MainActivity.this, s, Toast.LENGTH_SHORT).show();
                    }
                });



输出结果:
accept: onNext = qwe
accept: onNext = asd
accept: onNext = zxc

3.from 可以将其他种类对象和数据如:Array,Iterable,Future转换为Observable。以便我们在数据流的整个生命周期使用统一的操作符来管理他们。
(1)fromArray

    Observable.fromArray("qwe", "asd", "zxc")
                .subscribe(new Consumer<String>() {
                    @Override
                    public void accept(@NonNull String s) throws Exception {
                        Log.d(TAG, "accept: onNext = " + s);
                        Toast.makeText(MainActivity.this, s, Toast.LENGTH_SHORT).show();
                    }
                });



输出结果:
accept: onNext = qwe
accept: onNext = asd
accept: onNext = zxc

(2)fromIterable

List<String> strList = new ArrayList<>();
        strList.add("qwe");
        strList.add("asd");
        strList.add("zxc");
        Observable.fromIterable(strList)
                .subscribe(new Consumer<String>() {
                    @Override
                    public void accept(@NonNull String s) throws Exception {
                        Log.d(TAG, "accept: onNext = " + s);
                        Toast.makeText(MainActivity.this, s, Toast.LENGTH_SHORT).show();
                    }
                });



输出结果:
accept: onNext = qwe
accept: onNext = asd
accept: onNext = zxc

(3)fromFuture 从Future的Callable获取数据

//买10斤萝卜5秒
        Callable callable1 = new Callable() {

            @Override
            public String call() throws Exception {
                try {
                    Thread.sleep(5000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                return "买10斤萝卜";
            }
        };
        ExecutorService executorService = Executors.newCachedThreadPool();
        Future<String> future1 = executorService.submit(callable1);
        Observable.fromFuture(future1)
                .subscribe(new Consumer<String>() {
                    @Override
                    public void accept(String s) throws Exception {
                        Log.d(TAG, "accept: future1 " + s);
                    }
                });
        try {
            Log.d(TAG, "返回值: 5秒 " + future1.get());
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }



输出结果:
返回值: 5秒 买10斤萝卜
accept: future1被发射的值: 买10斤萝卜

(4)fromPublish    从响应式数据流获取要发射的数据,Flowable 实现了 Publisher

Flowable<String> flowable = Flowable.create(new FlowableOnSubscribe<String>() {
            @Override
            public void subscribe(FlowableEmitter<String> emitter) throws Exception {
                emitter.onNext("123");
                emitter.onNext("456");
                emitter.onNext("789");
            }
        },BackpressureStrategy.BUFFER);
        Observable.fromPublisher(flowable).subscribe(new Consumer<String>() {
            @Override
            public void accept(String s) throws Exception {
                
            }
        });



4.combineLatest 当其中一个Observable发射了数据,通过Function组合每个Observable最新发射的一个数据,然后发射这个组合。

Observable<String> ob1 = Observable.just("name");
        Observable<String> ob2 = Observable.just("password");
        Observable.combineLatest(ob1, ob2, new BiFunction<String, String, Object>() {
            @Override
            public Object apply(String s1, String s2) {
                return null;
            }
        });


defer 一直等待,直到有订阅者,才为每一个订阅者单独创建一个新的Observable,以确保发射的是最新的数据。

Observable observable = Observable.defer(new Callable<ObservableSource<? extends String>>() {
            @Override
            public ObservableSource<? extends String> call() throws Exception {
                return Observable.just("qwe","asd","zxc");
            }
        });
        observable.subscribe(new Consumer<String>() {
            @Override
            public void accept(String s) throws Exception {
                Log.d(TAG, "accept: " + s);
            }
        });



6.intenterval 按固定时间间隔发射一个从0开始无限递增的整数序列。

Observable.interval(5,TimeUnit.MILLISECONDS)
               .take(10)
               .subscribe(new Consumer<Long>() {
                   @Override
                   public void accept(Long aLong) throws Exception {
                       Log.d(TAG, "accept: " + aLong);
                   }
               });



输出结果:
accept: 0
accept: 1
accept: 2
accept: 3
accept: 4
accept: 5
accept: 6
accept: 7
accept: 8
accept: 9

7. range(int start,int count) 创建一个给定初始整数值start,发射count次,每次start++的Observable。

Observable.range(3,4)
               .subscribe(new Consumer<Integer>() {
                   @Override
                   public void accept(Integer integer) throws Exception {
                       Log.d(TAG, "accept: " + integer);
                   }
               });



输出结果:
accept: 3
accept: 4
accept: 5
accept: 6

8.intentervalRange(start,count,delay,interval,时间单位) 创建一个起始值start,发射count次,延迟delay,发射周期interval的Observable。

final long start = System.currentTimeMillis();
        Log.d(TAG, "初始时间: " + 0);
        //从3开始 发射4次 延迟50毫秒发射 发射周期100毫秒
       Observable.intervalRange(3,4,1000,1000,TimeUnit.MILLISECONDS)
               .subscribe(new Consumer<Long>() {
                   @Override
                   public void accept(Long aLong) throws Exception {
                       Log.d(TAG, "收到值:" + aLong + "  时间:" + (System.currentTimeMillis() - start));
                   }
               });



输出结果:
初始时间: 0
收到值:3 时间:1025
收到值:4 时间:2032
收到值:5 时间:3027
收到值:6 时间:4031

9.timer 创建一个给定延迟后才发射一个特殊值0的Observable。

final long start = System.currentTimeMillis();
        Log.d(TAG, "初始时间: " + 0);
       Observable.timer(2,TimeUnit.SECONDS)
               .subscribe(new Consumer<Long>() {
                   @Override
                   public void accept(Long aLong) throws Exception {
                       Log.d(TAG, "收到值:" + aLong + "  时间:" + (System.currentTimeMillis() - start));
                       Observable.just(1,2,3)
                               .subscribe(new Consumer<Integer>() {
                                   @Override
                                   public void accept(Integer integer) throws Exception {
                                       Log.d(TAG, "延迟2秒后,收到到0这个值,再自定义发射数据" + integer);
                                   }
                               });
                   }
               });



输出结果:
初始时间: 0
收到值:0 时间:2031
延迟2秒后,收到到0这个值,再自定义发射数据1
延迟2秒后,收到到0这个值,再自定义发射数据2
延迟2秒后,收到到0这个值,再自定义发射数据3

10.concat    按顺序链接多个Observable的数据

Observable<String> ob1 = Observable.just("name");
        Observable<String> ob2 = Observable.just("password");
        Observable.concat(ob1,ob2)
                .subscribe(new Consumer<String>() {
                    @Override
                    public void accept(String s) throws Exception {
                        
                    }
                });


11.generate

//Callable<Integer>返回一个状态,此处返回0,每次发射一个数据,currentStata++,直到currentStata>=10结束,
        Observable.generate(new Callable<Integer>() {
            @Override
            public Integer call() {
                return 0;
            }
        }, new BiConsumer<Integer, Emitter<String>>() {
            @Override
            public void accept(Integer currentStata, Emitter<String> emitter) throws Exception {
                if (currentStata < 10){
                    emitter.onNext("songfeng");
                }else {
                    emitter.onComplete();
                }
                currentStata++;
            }
        }).subscribeOn(Schedulers.newThread())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(new Consumer<String>() {
            @Override
            public void accept(String s) throws Exception {
                Log.d(TAG, "accept: " + s);
            }
        });

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值