rxJava实例分析

来源:互联网 发布:淘宝网天天特价入口 编辑:程序博客网 时间:2024/05/24 04:15

最近在gitHub上看到了一个开源项目,clone下来以后发现有许多可以学习的地方。
一直使用陈旧的思路来开发android的app,看到新的方法思路,实在是感觉需要学习的东西太多,这就是与时俱进吧。平时开发app一般都是用android-async-http或是volley,传统的回调方式。而该项目使用rxJava+retrofit+okHttp,最重要的就是rxJava,现在很流行的响应式编程。下面就用比较通俗的方式做一个代码分析:

以下是请求服务器的源代码:

Subscription s = Observable.zip(sDrakeet.getMeizhiData(mPage), sDrakeet.get休息视频Data(mPage),                this::createMeizhiDataWith休息视频Desc)                .map(meizhiData -> meizhiData.results)                .flatMap(Observable::from)                .toSortedList(                        (meizhi1, meizhi2) -> meizhi2.publishedAt.compareTo(meizhi1.publishedAt))                .doOnNext(this::saveMeizhis)                .observeOn(AndroidSchedulers.mainThread())                .subscribe(meizhis -> {                    Log.d("subscribe", "subscribe is runing");                    if (clean) mMeizhiList.clear();                    mMeizhiList.addAll(meizhis);                    mMeizhiListAdapter.notifyDataSetChanged();                    setRequestDataRefresh(false);                }, throwable -> loadError(throwable));addSubscription(s);
public void addSubscription(Subscription s) {        if (this.mCompositeSubscription == null) {            this.mCompositeSubscription = new CompositeSubscription();        }        this.mCompositeSubscription.add(s);    }

以上代码,对于一个不太了解响应式编程与rxJava的人,还真是很难理解。经过google与实际分析,需要了解的知识点有以下几点:
1.引入rxJava(是一个很有名的框架)
2.lambda表达式(java8新知识)

下面做个通俗的理解与分析:
rxJava基础:
RxJava最核心的两个东西是Observables(被观察者,事件源)和Subscribers(观察者)。Observables发出一系列事件,Subscribers处理这些事件。这里的事件可以是任何你感兴趣的东西(触摸事件,web接口调用返回的数据。。。)

一个Observable可以发出零个或者多个事件,知道结束或者出错。每发出一个事件,就会调用它的Subscriber的onNext方法,最后调用Subscriber.onNext()或者Subscriber.onError()结束。

Rxjava的看起来很想设计模式中的观察者模式,但是有一点明显不同,那就是如果一个Observerble没有任何的的Subscriber,那么这个Observable是不会发出任何事件的。

个人理解:
1.Rxjava
Observables就是在请求时候的请求方法,subscribe就是请求成功以后的结果处理。只要设置了订阅方subscribe,如果请求成功,就会执行subscribe(订阅者)里面的方法。
源码中:Observable.zip(…).subscribe(…),其中zip就是被观察者(Observables)。在rxJava里,有just、zip等等操作符(此处不深入)。

zip(sDrakeet.getMeizhiData(mPage), sDrakeet.get休息视频Data(mPage),this::createMeizhiDataWith休息视频Desc)

意思是将 sDrakeet.getMeizhiData(mPage)与sDrakeet.get休息视频Data(mPage)一起请求,返回结果成功后再执行:this::createMeizhiDataWith休息视频Desc

接着需要通过map将返回的结果进行转换 .map(meizhiData -> meizhiData.results) 此处直接通过map就可以自动将一个meizhiData转为meizhiData.results对像。

.flatMap(Observable::from) flatMap的功能非常强大,此处可以理解为:Observable.from(list) list就是推测出来的类型 也就是createMeizhiDataWith休息视频Desc返回的类型

需要说明doOnNext(this::saveMeizhis) 这个方法会在subscribe之前执行,此处是保存一个列表

observeOn(AndroidSchedulers.mainThread()) 指定订阅者运行的线程是主线程

addSubscription 通过mCompositeSubscription持有Subscription(订阅者),方便生命周期的管理

2.lambd表达式
“->” 是具体简化代码作用,java会自动推算出参数的类型。“::” 会自动推测出需要传递的变量类型,如果返回参数是String型,需要打印出结果:system.out.println(str) 在rxJava可写成 system.out::println

初次接触Rxjava,感觉很有意思,需要学习的地方还很多,以后慢慢摸索。正如网上所说:一旦你弄明白了,你就会发现RxJava真是太棒了。
最后顺便推广一个网站,android与Ios工程狮的福利:http://gank.io/ 每天中午更新,满满的干货!

0 0
原创粉丝点击