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/ 每天中午更新,满满的干货!
- rxJava实例分析
- RxJava实例及原理分析,以及RXJAVA2
- RxJava分析
- RxJava实例(一)
- RxJava实例(二)
- RxJava实例(三)
- RxJava实例-线程切换
- rxjava 常用用法实例
- Rxjava分析—Subject
- Rxjava分析—Subject
- RxJava源码初步分析
- Rxjava Subject分析
- RxJava源码分析
- RxJava源码分析
- Rxjava Subject分析
- RXJava map方法分析
- Android:RxJava分析
- Rxjava分析—Subject
- linux安装启动openoffice
- Xcode7 sqllite问题解决
- PHP代码优化的53个细节
- Dubbo之旅--扩展注册中心
- ShowModal在VCL和Firemonkey中的使用区别
- rxJava实例分析
- Mac电脑搭建 svn 服务器
- Bitcode是什么,如何配置?
- php 不重新编译增加openssl扩展
- Dubbo之旅--结果缓存
- leetcode-Pascal's Triangle II
- 克服VR眩晕之帧数:提升UE4内容实时渲染效率
- MOS管击穿原因和防护措施!
- 基于LUFA开源框架库对AVR芯片进行USB终端设备开发