RxJava(八)Disposable和Transformer

Disposable和Transformer

一,Disposable
1.当Observable发送数据,Observer订阅数据时,就形成一个Disposable,可用于在退出时取消订阅。

 Disposable disposable = Observable.just(1,2,3)
        .subscribeOn(Schedulers.newThread())
        .observeOn(AndroidSchedulers.mainThread())
        .map(new Function<Integer, Integer>() {
            @Override
            public Integer apply(Integer integer) {
                return integer + 1;
            }
        }).subscribe(new Consumer<Integer>() {
                   @Override
                   public void accept(Integer integer) throws Exception {

                   }
               });
    }

2.CompositeDisposable 一个复合订阅容器,用于管理所有的Disposable,方便在退出时取消订阅,避免内存溢出。
通常写在BaseActivity中。RxLifecycle生命周期管理放内存泄露

CompositeDisposable compositeDisposable = new CompositeDisposable();

        Disposable disposable = Observable.just(1, 2, 3)
                .subscribeOn(Schedulers.newThread())
                .observeOn(AndroidSchedulers.mainThread())
                .map(new Function<Integer, Integer>() {
                    @Override
                    public Integer apply(Integer integer) {
                        return integer + 1;
                    }
                }).subscribe(new Consumer<Integer>() {
                    @Override
                    public void accept(Integer integer) throws Exception {

                    }
                });
        //添加Disposable到容器统一管理
        compositeDisposable.add(disposable);
        //当退出时,如onDestory中调用,取消所有订阅
        compositeDisposable.clear();

二,Transformer 转换器
可通过一个Transformer转换器将Observable/Flowable/Completable/Maybe/Single转换为另一个Observable/Flowable/Completable/Maybe/Single。
转换器:ObservableTransformer,FlowableTransformer,CompletableTransformer,MaybeTransformer,SingleTransformer。

//数据转换
public static ObservableTransformer<Integer,String> intToStrTransformer(){
        //Integer转String的转换器
        return new ObservableTransformer<Integer, String>() {
            //返回一个发射String数据的Observable
            @Override
            public ObservableSource<String> apply(Observable<Integer> upstream) {
                return upstream.map(new Function<Integer, String>() {
                    @Override
                    public String apply(Integer integer) throws Exception {
                        return integer.toString();
                    }
                });
            }
        };
    }

    private void MyTest(){
        Observable.just(1,2,3)
                .compose(intToStrTransformer())
                .subscribe(new Consumer<String>() {
                    @Override
                    public void accept(String s) throws Exception {

                    }
                });
    }
//切换线程
public static <T> FlowableTransformer<T,T> transToMain(){

        return new FlowableTransformer<T, T>() {
            //返回一个在io线程发送数据,在main线程处理数据的Publisher
            @Override
            public Publisher<T> apply(Flowable<T> upstream) {
                return upstream.subscribeOn(Schedulers.io())
                        .observeOn(AndroidSchedulers.mainThread());
            }
        };
    }

    private void MyTest(){
        Flowable.interval(1000, TimeUnit.MILLISECONDS)
                .onBackpressureBuffer()
                .compose(transToMain())
                .subscribe(new Consumer<Long>() {
                    @Override
                    public void accept(Long aLong) throws Exception {
                        log.d(TAG, "accept: "+aLong);
                    }
                });
    }
//缓存数据
    public static <T> FlowableTransformer<T,T> transToCache(final String key, final Cache cache){
        

        return new FlowableTransformer<T, T>() {
            @Override
            public Publisher<T> apply(Flowable<T> upstream) {
                return upstream.map(new Function<T, T>() {
                    @Override
                    public T apply(T t) throws Exception {
                        cache.put(key,t)
                        return t;
                    }
                });
            }
        };
           
    }

    private void MyTest(){
        Flowable.interval(1000, TimeUnit.MILLISECONDS)
                .onBackpressureBuffer()
                .compose(MainActivity.<Long>transToCache("key",new Cache()))
                .subscribe(new Consumer<Long>() {
                    @Override
                    public void accept(Long aLong) throws Exception {
                        log.d(TAG, "accept: "+aLong);
                    }
                });
    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值