最近在做一个很有趣的项目,需求明确应用界面是console的gui。
在现在这个年代,这种朴素的需求实在少见。
项目大量消费自有的或者外部的API,自身逻辑还是很简单。但是其中大量的异步消费远程API,解析数据,更新UI还是让人很烦。
想起来了RxJava,代码上得到了很多简化,不敢说是最佳实践,但是换一种风格总有一些新鲜的体验。
普通方法
先来个简单的,一个和比特币有关的API,https://blockchain.info/ticker 。
这个API返回的是当前比特币交易价格,返回内容如下:
处理的思路也简化一下,这里我们需要最新的以美元表示的交易价格,代码如下:
看着有些繁琐,但是功能是实现了。
如果需要获取其他货币表示直接在其中添加即可。
但是整个项目有很多类似的代码,都是起一个线程来请求,请求以后处理并更新UI。而且处理过程非常类似,转为JsonMap,从Map中取值。
引入RxJava
RxJava背后是Netflix,对于并发模型支持较好,能够利用服务器侧的并发,而无需触及典型的线程安全和同步问题。其API的实现控制了并发原语,能追求系统性能的提升,而不必担心破坏客户端代码。
当然,还有一个名字,反应性编程,infoq中有一个专栏 http://www.infoq.com/reactive-extensions/。
具体的理念啥的就不细说了,都是能Google到的。
来看下改进后的效果。
首先需要一个Observable
其次需要多个map
一个map是对Json的转换,一个map是对SpEL的支持,方便灵活的取值。
最后来一个subscribe来更新UI
最后组合在一起
效果如下:
定时更新
这里是一个单纯的数据展示,而且只会执行一次,如果需要定时执行,RxJava也有相关的支持。
RxJava提供了Schedulers
来处理这种情况。具体又包括了三种
- computationScheduler
- ioScheduler
- newThreadScheduler
这里选用newThreadScheduler。
多个订阅者
如果我们需要根据统一结果做出不同的操作,比如获取API数据以后,获取两个不同的值,然后更新到两个不同的地方,那么我们就需要两个订阅者了。
使用publish方法可以声明该结果对外公布,然后添加所有所需的订阅者后connect。
写在最后
RxJava的API无疑是简单的,背后的功能和思路更是值得学习的。
所谓的反应性编程其实本质是拉模型和推模型的思考。程序=数据+算法,那么数据源是由数据源将数据推给算法,算法被动地等待数据的到来还是数据源等待算法的访问,算法主动地将数据从数据源中拉出?
回调函数是典型的推模型的应用,设计模式中的 Command,Visitor 中都有回调函数的影子。
拉模型符合人的思考逻辑,状态由运行时的栈自动维护,理解容易;推模型性能好,但写起来不容易,而且需要自己维护相关状态。
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
转载自夜明的孤行灯
本文链接地址: https://www.huangyunkun.com/2015/06/27/rxjava-simple-program/