`
gybin
  • 浏览: 268988 次
  • 性别: 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-Android-Samples

    - **Samples**:包含各种 RxJava 使用场景的示例代码,如基本操作、线程切换、错误处理、订阅管理等。 - **Dependencies**:项目依赖的库,如 RxJava、RxAndroid、Retrofit 等。 - **Build.gradle**:项目构建配置,...

    RxJava使用

    **二、RxJava的使用场景** 1. **网络请求**:使用RxJava进行网络请求可以将请求、解析和处理逻辑封装在一起,使代码更加简洁。 2. **异步任务**:通过`subscribeOn()`和`observeOn()`控制线程,可以轻松实现后台...

    rxjava2中常见的使用场景demo

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

    无损压缩可以结合RXjava使用

    "无损压缩可以结合RXjava使用" 这个主题涉及到的是如何利用特定的图片处理库来实现无损压缩,并且通过结合RXJava进行高效、流畅的链式操作。这里我们将详细探讨无损压缩的原理、RXJava的优势以及如何将两者结合。 ...

    RxJava使用测试

    **使用场景** 1. **事件监听**:RxJava可以替代传统的Android事件监听器,如OnClickListener,使得事件处理更加简洁和灵活。 2. **网络请求**:在Android应用中,RxJava常与Retrofit结合,用于处理网络请求,提供...

    RxJava之BehaviorSubject使用

    在Android开发中,RxJava是一个广泛使用的响应式编程库,它允许开发者以声明式的方式处理异步数据流。BehaviorSubject是RxJava中的一个特殊类型的行为观察者,它扮演着 observable 和 observer 的双重角色,能够存储...

    RxJava使用Demo

    在“rxjavademo”这个压缩包中,很可能包含了使用Single的各种示例代码,包括上述提到的创建、转换、错误处理、合并、延迟执行和回调订阅等场景。通过分析和运行这些示例,开发者可以更深入地了解RxJava的工作机制,...

    安卓开发进阶之RxJava在实际项目中使用--第一篇

    在实际项目中,RxJava的应用场景非常广泛: - **网络请求**:借助Retrofit与RxJava的结合,我们可以轻松处理网络请求,同时利用操作符处理返回的数据,例如,可以使用`map`将JSON字符串转换为Java对象,`...

    基于RxJava2.0的任务队列

    总之,基于RxJava2.0的任务队列是一种强大的工具,它利用了响应式编程的理念,解决了在Android开发中需要有序执行任务的场景。通过深入理解并熟练运用这个技术,开发者可以提高代码的可维护性,降低并发问题,并实现...

    中文版超详细RxJava图文入门教程【PDF】

    我们还将学习如何使用 RxJava 实现常见的场景,例如网络请求、文件读写等。 RxJava 的优点包括: * 简单易用:RxJava 提供了简洁的 API,易于使用和理解。 * 异步编程:RxJava 支持异步编程,能够提高应用程序的...

    RxJavaBridge,RXJava 2和RXJava 3之间的桥梁.zip

    - **性能优化**:RXJava 3对内部实现进行了优化,提高了性能,但同时也可能影响到某些特定场景下的代码。 - **弃用警告**:RXJava 3移除了一些旧API,添加了弃用警告,提醒开发者进行迁移。 2. **RxJavaBridge的...

    RxJava+Retrofit简单Demo

    在Android开发中,RxJava被广泛用于处理网络请求、定时任务、事件监听等场景。其核心概念包括`Observable`(可观察者)、`Observer`(观察者)、各种操作符(如map、filter、concatMap等)以及线程控制策略。 **...

    高清彩版 Learning RxJava

    通过本章的学习,我们了解了 RxJava 的核心概念、应用场景以及如何在实际项目中应用 RxJava 进行高效的异步编程。RxJava 不仅能够提高代码的可读性和可维护性,还能帮助开发人员更好地处理复杂的异步数据流问题。...

    Rxjava Android 开发视频

    #### 四、RxJava在Android中的应用场景 - **网络请求**:结合Retrofit等网络框架,简化异步网络请求的代码。 - **数据库操作**:如RxJava与Room结合,实现异步数据库操作。 - **UI更新**:使用RxJava处理UI线程与...

    RxJava整合Retrofit2.0网络框架

    现在,我们可以使用RxJava订阅这个网络请求,处理返回的数据: ```java weatherService.getWeather("北京") .subscribeOn(Schedulers.io()) // 在IO线程执行网络请求 .observeOn(AndroidSchedulers.mainThread())...

    Rxjava官网中文翻译

    **RxJava** 是一个在Java虚拟机上运行的库,它允许开发人员使用反应式编程范式来处理异步数据流。反应式编程是一种声明式的编程风格,它以数据流和变化传播为中心,使得程序能够更高效、简洁地处理事件和数据。...

    RxJava中多种场景的实现总结

    在本文中,我们将深入探讨RxJava中几种关键的使用场景,包括推迟执行动作、推迟发送执行的结果以及在指定线程中执行操作。RxJava是一个强大的响应式编程库,它允许开发者通过观察者模式来处理异步事件和数据流。下面...

    Android rxjava的使用

    本篇文章将详细讲解如何在Android中使用RxJava,包括事件的发送、线程的调度以及数据的比对。 首先,让我们理解一下RxJava的核心概念。RxJava是一个基于观察者模式的库,它允许我们通过定义Observable(可观察者)...

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

    本篇文章将详细讲解如何利用RxJava来实现倒计时功能,这种功能通常在注册页面的发送验证码场景中使用。 ### 1. RxJava简介 RxJava 是一个用于处理异步数据流的库,它引入了“反应式编程”的概念,让开发者可以更...

Global site tag (gtag.js) - Google Analytics