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); } }); }