`
gybin
  • 浏览: 263675 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

RxJava的使用场景

阅读更多

这篇blog主要是讨论一些RxJava比较常用的场景,大部分例子取自我自己的一些使用经验,欢迎大家来补充。

取数据先检查缓存的场景

我们经常遇到的一个场景是,在获取数据的时候,首先检查缓存当中是否有缓存的数据,如果有,就返回缓存中的数据,否则就从数据源重新拉取数据。

使用RxJava的concat+first operator可以很容易的满足这种场景。

final Observable<String> memory = Observable.create(new Observable.OnSubscribe<String>() {
    @Override
    public void call(Subscriber<? super String> subscriber) {
        if (memoryCache != null) {
            subscriber.onNext(memoryCache);
        } else {
            subscriber.onCompleted();
        }
    }
});
Observable<String> disk = Observable.create(new Observable.OnSubscribe<String>() {
    @Override
    public void call(Subscriber<? super String> subscriber) {
        String cachePref = rxPreferences.getString("cache").get();
        if (!TextUtils.isEmpty(cachePref)) {
            subscriber.onNext(cachePref);
        } else {
            subscriber.onCompleted();
        }
    }
});

Observable<String> network = Observable.just("network");

//主要就是靠concat operator来实现
Observable.concat(memory, disk, network)
.first()
.subscribeOn(Schedulers.newThread())
.subscribe(s -> {
    memoryCache = "memory";
    System.out.println("--------------subscribe: " + s);
});

如果我们想要的效果是先从缓存取出数据,显示,然后再从数据源重新拉取数据,再显示呢?依然很简单,去掉first就可以了。concat可以保证两个Observable是按照顺序执行。

界面需要等到多个接口并发取完数据,再更新

很多时候,我们一个界面所有的数据并不是由一个接口返回的,客户端可能需要并发调用多个接口,然后等这些接口的数据都返回之后,才去显示。
RxJava的merge operator正好可以满足这种需求。

//拼接两个Observable的输出,不保证顺序,按照事件产生的顺序发送给订阅者
private void testMerge() {
    Observable<String> observable1 = DemoUtils.createObservable1().subscribeOn(Schedulers.newThread());
    Observable<String> observable2 = DemoUtils.createObservable2().subscribeOn(Schedulers.newThread());

    Observable.merge(observable1, observable2)
            .subscribeOn(Schedulers.newThread())
            .subscribe(System.out::println);
}

当然,merge有一个缺陷是它要求两个Observable中的数据类型是一致的,这堆刚才说的那个场景可能有点困难,那么我们可以考虑使用zip这个operator,
zip并去强制要求多个Observable中的数据类型是一致的。

一个接口的请求依赖另一个API请求返回的数据

举个例子,我们经常在需要登陆之后,根据拿到的token去获取消息列表。

这里用RxJava主要解决嵌套回调的问题,有一个专有名词叫Callback hell

NetworkService.getToken("username", "password")
    .flatMap(s -> NetworkService.getMessage(s))
    .subscribe(s -> {
        System.out.println("message: " + s);
    });

界面按钮需要防止连续点击的情况

RxView.clicks(findViewById(R.id.btn_throttle))
    .throttleFirst(1, TimeUnit.SECONDS)
    .subscribe(aVoid -> {
        System.out.println("click");
    });

响应式的界面

比如勾选了某个checkbox,自动更新对应的preference

SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
RxSharedPreferences rxPreferences = RxSharedPreferences.create(preferences);

Preference<Boolean> checked = rxPreferences.getBoolean("checked", true);

CheckBox checkBox = (CheckBox) findViewById(R.id.cb_test);
RxCompoundButton.checkedChanges(checkBox)
        .subscribe(checked.asAction());

复杂的数据变换

Observable.just("1", "2", "2", "3", "4", "5")
    .map(Integer::parseInt)
    .filter(s -> s > 1)
    .distinct()
    .take(3)
    .reduce((integer, integer2) -> integer.intValue() + integer2.intValue())
    .subscribe(System.out::println);//9
分享到:
评论

相关推荐

    RxJava之BehaviorSubject使用

    RxJava中BehaviorSubject适合的使用场景代码

    rxjava2中常见的使用场景demo

    demo中有几个常见的Rxjava2中使用的场景,然后使用中有常见的有,在一个界面中有不同的接口请求,可以使用zip控制,使接口中的数据同一时间返回来,但是在zip中 apply()必须返回一个json,就是不同接口转换成一个...

    Android开发丶使用RxJava来完成倒计时功能

    使用RxJava来完成倒计时功能,一般使用场景是注册页面的发送验证码。

    RxJava中多种场景的实现总结

    给大家详细介绍了RxJava中多种场景的实现,对大家学习使用RxJava具有一定的参考借鉴价值,有需要的朋友们可以参考学习,下面来一起看看吧。

    Android代码-rxjava-examples

    理解RxJava API的一个关键是明白API需要Observable的Case是异步使用场景,而返回普通对象类型的是同步使用场景, 比如flatmap与map, buffer中的多个重载等。 讲解RxJava如何使用的示例工程,你可以将它安装在...

    RxJavaNotes:RxJava2 应用场景总结及源码学习笔记

    RxJava2 Learning Notes 原理 一系列的事件序列,通过上下游链接,使得上游没产生一个事件,下游就能接收到该事件。 上游和下游就分别对应着RxJava中的Observable和Observer;两者之间的连接就对应着subscribe() 只有...

    今天让你学好Rxjava

    1.我来告诉你为什么要学Rxjava 2.代码基本实现 3.应用场景 4.各种异步操作

    rxJava 如何使用的示例工程

    作者leeowenowen,源码rxjava-examples,理解 RxJava API 的一个关键是明白 API 需要 Observable 的 Case 是异步使用场景,而返回普通对象类型的是同步使用场景, 比如 flatmap 与 map, buffer 中的多个重载等。...

    RxJava之网络请求最常见的三种场景

    本文想阐述一下当你开发Android应用并采用RxJava作为你的架构,尤其是有关网络请求时最常见的三种场景。这篇文章主要介绍了RxJava之网络请求最常见的三种场景,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

    给Android开发者的RxJava详解

    今年加入了Flipboard后,看到Flipboard的Android项目也在使用RxJava,并且使用的场景越来越多。而最近这几个月,我也发现国内越来越多的人开始提及RxJava。有人说『RxJava真是太好用了』,有人说『RxJava真是太难用...

    Java扩展库RxJava的基本结构与适用场景小结

    RxJava(GitHub: https://github.com/ReactiveX/RxJava)能够帮助Java进行异步与事务驱动的程序编写,这里我们来作一个Java扩展库RxJava的基本结构与适用场景小结,刚接触RxJava的同学不妨看一下^^

    AndroidRxJava实战讲解:优雅实现网络请求轮询

    1.Rxjava,由于其基于事件流的链式调用、逻辑简洁 ...今天,我将为大家带来Rxjava创建操作符的常见开发应用场景:轮询需求 ,并结合Retrofit与RxJava实现,希望大家会喜欢。 1.本系列文章主要基于Rxjava2.02.接下来的时

    Android使用Kotlin和RxJava 2.×实现短信验证码倒计时效果

    本文介绍了Android使用Kotlin和RxJava 2.×实现短信验证码倒计时效果,分享给大家,具体如下: 场景:注册账号页面时,我们点击按钮发送验证码,在等待验证码时,界面会有倒计时提示,这此期间按钮不可点击。当倒...

    RxJavaDemo.rar

    RxJava3.0使用场景及案例,欢迎下载~

    RxJava入门之介绍与基本运用

    因为这个RxJava内容不算少,而且应用场景非常广,所以这个关于RxJava的文章我们会陆续更新,今天就来先来个入门RxJava吧 初识RxJava 什么是Rx 很多教程在讲解RxJava的时候,上来就介绍了什么是RxJava。这里我先说...

    RxMapsAndroid:基于 RxJava 的 Android 地图客户端

    本项目的目的不是与其他地图客户端和地图 SDK 竞争,而是为了说明 RxJava 在现实生活场景中的使用。技术栈目前使用的框架并不多: RxJava OkHttp客户端平铺服务器您可以在 Configuration.java 中看到切片服务器端点...

    android使用Rxjava实现倒计时功能

    一般我们在开发时,常会遇到使用倒计时的场景,以前一般会使用thread+handler来实现,而强大的Rxjava横空出世后,使这一切变得简单了。我们可以在子线程中直接使用发射器每融1S发出一个时间,在主线程中接收更新ui,...

    使用RxJava2 和 Java 8的特性开发的图片爬虫.zip

    爬虫通常由搜索引擎、数据挖掘工具、监测系统等应用于网络数据抓取的场景。 爬虫的工作流程包括以下几个关键步骤: URL收集: 爬虫从一个或多个初始URL开始,递归或迭代地发现新的URL,构建一个URL队列。这些URL...

Global site tag (gtag.js) - Google Analytics