RxJava使用介绍

RxJava介绍

RxJava 是一个响应式编程框架,采用观察者设计模式。所以自然少不了 Observable 和 Subscriber 这两个东东了。用于通过使用观察序列构成异步和基于事件的程序库.

RxJava 是一个开源项目,地址:https://github.com/ReactiveX/RxJava

RxJava 扩展了观察者模式,以支持数据、事件序列,并增加了参数,让你编写的序列一起同时申明抽象事物,如低级别的线程、同步,提高线程安全和避免因为并发导致的数据担忧;

Java

public static void hello(String... names) {
    Observable.from(names).subscribe(new Action1<String>() {

        @Override
        public void call(String s) {
            System.out.println("Hello " + s + "!");
        }

    });
}

输出

hello("Ben", "George");

Hello Ben!
Hello George!

基础知识

响应式代码的基本组成部分是Observables和Subscribers(事实上Observer才是最小的构建块,但实践中使用最多的是Subscriber,因为Subscriber才是和Observables的对应的。)。Observable发送消息,而Subscriber则用于消费消息。

消息的发送是有固定模式的。Observable可以发送任意数量的消息(包括空消息),当消息被成功处理或者出错时,流程结束。Observable会调用它的每个Subscriber的Subscriber.onNext()函数,并最终以Subscriber.onComplete()或者Subscriber.onError()结束。

这看起来像标准的观察者模式,但不同的一个关键点是:Observables一般只有等到有Subscriber订阅它,才会开始发送消息(术语上讲就是热启动Observable和冷启动Observable。热启动Observable任何时候都会发送消息,即使没有任何观察者监听它。冷启动Observable只有在至少有一个订阅者的时候才会发送消息(我的例子中都是只有一个订阅者)。这个区别对于开始学习RxJava来说并不重要。)。换句话说,如果没有订阅者观察它,那么将不会起什么作用。

如何设计使用RXJAVA

使用RxJava创建观测者(其中操作参数),变换各种方式的观测者,以获得精确的数据项你感兴趣的(通过使用可观察到的参数),然后观察,并实施观察员反应的有趣的项目,这些序列(或订户然后订阅他们得到的变换观测者)。

添加

Maven

<dependency>
    <groupId>io.reactivex</groupId>
    <artifactId>rxjava</artifactId>
    <version>x.y.z</version>
</dependency>

Ivy

<dependency org="io.reactivex" name="rxjava" rev="x.y.z" />

实际项目代码举例程序:

    List<Map> paraList = new ArrayList<Map>();
    paraList = (List<Map>) map.get("paraMap");
    for (Map paraMap : paraList) {
        Iterator<String> mapIter = map.keySet().iterator();
        while (mapIter.hasNext()) {
            String key = mapIter.next();
            if (map.get(key) instanceof String) {
                paraMap.put(key, map.get(key));
            }
        }
    }

    final List<Map> resultList = new ArrayList<Map>();
    //Func1(from,to) 
    Observable.from(paraList).parallel(new Func1<Observable<Map>, Observable<Map>>() {
        @Override
        public Observable<Map> call(Observable<Map> request) {
            return request.map(new Func1<Map, Map>() {
                @Override
                public Map call(Map paraMap) {
                    Map resultMap = new HashMap();
                    try {
                        resultMap = commonCalculateQueryService.commonCalculate(paraMap);
                    } catch (Exception e) {
                        logger.debug(" execute Query : " + e.toString());
                        Map exceptionMap = new HashMap();
                        exceptionMap.put("request_uuid", (String) paraMap.get("requestUuid"));
                        exceptionMap.put("process_unit", Result.NOR);
                        exceptionMap.put("exception_text", e.toString());
                        exceptionMap.put("insert_by", "Lenvon");
                        commonCalculateQueryService.insertResultProcessException(exceptionMap);
                        resultMap.put("replyCode", ReplyCode.ERROR);
                        resultMap.put("replyText", e.toString());
                        resultMap.put("status", StatusCode.N);
                        logger.error(" FreightCalculator Exception : ", e);
                    }
                    return resultMap;
                }
            });
        }
    }, Schedulers.threadPoolForComputation()).toBlockingObservable().forEach(new Action1<Map>() {
        @Override
        public void call(Map resultMap) {
            resultList.add(resultMap);
        }
    });

其中

paraList:操作参数队列;

resultList:结果队列;

实际处理图序:

这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值