RxJava系列:理解rxjava中的compose操作符

理解rxjava中的compose

一.compose基本概念及使用

引入:

Obsrvable.just().map.map.map.filter.subscribeOn.observeOn.subscribe()


如果我们相对多个流重复利用一系列操作符该怎么办?

一种方式是,提取一个工具方法,把复用的地方抽取成一个方法applySchedulers。

applySchedulers(Observable.from(someSource)).subscribe


另外一种方法就是使用compose. compose常和Transformers。

Transformers

public interface Transformer<T, R> extends Func1<Observable<T>, Observable<R>> {
        // cover for generics insanity
    }


换句话说就是提供给他一个Observable它会返回给你另一个Observable,这和lift等操作符有着同等功效。

例如: 
定义一个Transformers。

public class SchedulerTransformer<T> implements Observable.Transformer<T, T> {
    @Override
    public Observable<T> call(Observable<T> observable) {
        return observable.subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread());
    }
}
        userUsecase.sendMsg(userId, msg)
                .compose(new SchedulerTransformer<SendMsgResult>())
                .subscribe(new Subscriber<SendMsgResult>() {
                    @Override
                    public void onCompleted() {

                    }

                    @Override
                    public void onError(Throwable e) {

                    }

                    @Override
                    public void onNext(SendMsgResult sendMsgResult) {
                                        }
                });


好处在于: 
1.实现一系列操作符的复用 
2.不破坏链式调用的结构

二.和flatmap的区别

我们知道,compose和flatMap都是以Observable<T>作为输入,Observable<R>作为输出,那么两者有什么区别呢

1.compose() 是唯一一个能从流中获取原生Observable 的方法,因此,影响整个流的操作符(像subscribeOn()和observeOn())需要使用compose(),相对的,如果你在flatMap()中使用subscribeOn()/observeOn(),它只影响你创建的flatMap()中的Observable,而不是整个流。


2.当你创建一个Observable流并且内联了一堆操作符以后,compose()会立即执行,flatMap()则是在onNext()被调用以后才会执行,换句话说,flatMap()转换的是每个项目,而compose()转换的是整个流。


3.flatMap()一定是低效率的,因为他每次调用onNext()之后都需要创建一个新的Observable,compose()是操作在整个流上的。


三.应用场景示例

可参考rxlifecycle绑定生命周期的时候就是使用的compose方法来复用一些处理逻辑。

 mMovieDetailHeaderCommand
                .getMovieEvents()
                .compose(this.<Movie>bindToLifecycle())
                .subscribe()

猜你喜欢

转载自blog.csdn.net/cmyperson/article/details/89373777
今日推荐