Disposable和Transformer
一,Disposable
1.当Observable发送数据,Observer订阅数据时,就形成一个Disposable,可用于在退出时取消订阅。 Disposable disposable = Observable.just(1,2,3) .subscribeOn(Schedulers.newThread()) .observeOn(AndroidSchedulers.mainThread()) .map(new Function() { @Override public Integer apply(Integer integer) { return integer + 1; } }).subscribe(new Consumer() { @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() { @Override public Integer apply(Integer integer) { return integer + 1; } }).subscribe(new Consumer() { @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 intToStrTransformer(){ //Integer转String的转换器 return new ObservableTransformer() { //返回一个发射String数据的Observable @Override public ObservableSource apply(Observable upstream) { return upstream.map(new Function() { @Override public String apply(Integer integer) throws Exception { return integer.toString(); } }); } }; } private void MyTest(){ Observable.just(1,2,3) .compose(intToStrTransformer()) .subscribe(new Consumer() { @Override public void accept(String s) throws Exception { } }); } //切换线程 public static FlowableTransformer transToMain(){ return new FlowableTransformer() { //返回一个在io线程发送数据,在main线程处理数据的Publisher @Override public Publisher apply(Flowable upstream) { return upstream.subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()); } }; } private void MyTest(){ Flowable.interval(1000, TimeUnit.MILLISECONDS) .onBackpressureBuffer() .compose(transToMain()) .subscribe(new Consumer() { @Override public void accept(Long aLong) throws Exception { log.d(TAG, "accept: "+aLong); } }); } //缓存数据 public static FlowableTransformer transToCache(final String key, final Cache cache){ return new FlowableTransformer() { @Override public Publisher apply(Flowable upstream) { return upstream.map(new Function() { @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.transToCache("key",new Cache())) .subscribe(new Consumer() { @Override public void accept(Long aLong) throws Exception { log.d(TAG, "accept: "+aLong); } }); }