rxJava实例分析
最近在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实例及原理分析,以及RXJAVA2
- php抽象类用法实例分析
- Sanic框架路由用法实例分析
- JS执行控制之节流模式实例分析
- nginx负载均衡与反向代理配置文件分析实例
- SlidingMenu官方实例分析3——PropertiesActivity
- smarty内部日期函数html_select_date()用法实例分析
- JavaScript拖拽、碰撞、重力及弹性运动实例分析
- Symfony2函数用法实例分析
- 针对复杂***的情报分析实例
- C++映像劫持后门实例分析
- ASP.NET中Dictionary基本用法实例分析
- MapReduce原理及实例分析
- rip路由协议 细节分析及实例配置【完整版】
- Java 程序最容易犯的 21 种错误实例分析
- jquery中animate的stop()方法作用实例分析
- 生产环境参数实例及分析【生产环境实例增加中】
- 【OpenGL】Shader实例分析(六)- 卡牌特效
- Android中的跨进程通信方法实例及特点分析(二):ContentProvider
- Wireshark抓包实例分析HTTP问题