您的位置:首页 > 编程语言 > Java开发

rxJava实例分析

2015-11-06 11:06 447 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/happykin/article/details/49680311

最近在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/ 每天中午更新,满满的干货!

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: