码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • RxJava 实例


    1.定义

    RxJava 是一个 基于事件流、实现异步操作的库

    2.作用

    用于实现异步操作,类似于 Android中的 AsyncTask 、Handler+new Thread的作用

    3. 特点

    由于 RxJava的使用方式是:基于事件流的链式调用,所以使得 RxJava:

    • 逻辑简洁
    • 实现优雅
    • 使用简单

    更重要的是,随着程序逻辑的复杂性提高,它依然能够保持简洁 & 优雅

    • Rxjava原理 基于 一种扩展的观察者模式

    • Rxjava的扩展观察者模式中有4个角色:

    角色作用类比
    被观察者(Observable)产生事件顾客
    观察者(Observer)接收事件,并给出响应动作厨房
    订阅(Subscribe)连接 被观察者 & 观察者服务员
    事件(Event)被观察者 & 观察者 沟通的载体菜式

    4.使用

    导包

    1. implementation 'io.reactivex.rxjava2:rxjava:2.1.3'
    2. implementation 'io.reactivex.rxjava2:rxandroid:2.0.1'
    3. implementation 'com.jakewharton.rxbinding2:rxbinding:2.2.0'

     1.定义被观察者

    三种方式:Observable.create、Observable.just、Observable.fromArray

    1. public void buyFood(){
    2. Observable<String> observable = Observable.create(new ObservableOnSubscribe<String>() {
    3. @Override
    4. public void subscribe(@NonNull ObservableEmitter<String> e) throws Exception {
    5. e.onNext("potato");
    6. e.onNext("tomato");
    7. e.onNext("noodles");
    8. e.onComplete();
    9. }
    10. });
    11. Observable<String> observable1 = Observable.just("potato","tomato","noodles");
    12. String [] foods = new String[]{"potato","tomato","noodles"};
    13. Observable<String> observable2 = Observable.fromArray(foods);
    14. }

    2.定义观察者

    使用observer或者subscriber

    1. Observer<String> mObserver = new Observer<String>() {
    2. @Override
    3. public void onSubscribe(@NonNull Disposable d) {
    4. }
    5. @Override
    6. public void onNext(@NonNull String s) {
    7. }
    8. @Override
    9. public void onError(@NonNull Throwable e) {
    10. }
    11. @Override
    12. public void onComplete() {
    13. }
    14. };
    1. Subscriber<String> mStringSubscriber = new Subscriber<String>() {
    2. @Override
    3. public void onSubscribe(Subscription s) {
    4. }
    5. @Override
    6. public void onNext(String s) {
    7. }
    8. @Override
    9. public void onError(Throwable t) {
    10. }
    11. @Override
    12. public void onComplete() {
    13. }
    14. };

    特别注意:2种方法的区别,即Subscriber 抽象类与Observer 接口的区别 
    // 相同点:二者基本使用方式完全一致(实质上,在RxJava的 subscribe 过程中,Observer总是会先被转换成Subscriber再使用)
    // 不同点:Subscriber抽象类对 Observer 接口进行了扩展,新增了两个方法:
        // 1\. onStart():在还未响应事件前调用,用于做一些初始化工作
        // 2\. unsubscribe():用于取消订阅。在该方法被调用后,观察者将不再接收 & 响应事件
        // 调用该方法前,先使用 isUnsubscribed() 判断状态,确定被观察者Observable是否还持有观察者Subscriber的引用,如果引用不能及时释放,就会出现内存泄露


    3.订阅

    observable.subscribe(observer);

    5.优雅实现

    1. Observable.create(new ObservableOnSubscribe() {
    2. @Override
    3. public void subscribe(@NonNull ObservableEmitter e) throws Exception {
    4. e.onNext("potato");
    5. e.onNext("tomato");
    6. e.onNext("noodles");
    7. e.onComplete();
    8. }
    9. }).subscribe(new Observer() {
    10. @Override
    11. public void onSubscribe(@NonNull Disposable d) {
    12. }
    13. @Override
    14. public void onNext(@NonNull String s) {
    15. }
    16. @Override
    17. public void onError(@NonNull Throwable e) {
    18. }
    19. @Override
    20. public void onComplete() {
    21. }
    22. });

    其他方法

    observeOn:观察者的执行线程

    observeOn 作用于该操作符之后直到出现新的observeOn操作符

    subscribeOn:被观察者的执行线程

    subscribeOn 作用于该操作符之前的 Observable 的创建操符作以及 doOnSubscribe 操作符 ,换句话说就是 doOnSubscribe 以及 Observable 的创建操作符总是被其之后最近的 subscribeOn 控制

    实例

    1. //将字符串转换成double类型
    2. String path = "12.3";
    3. public void test(){
    4. //输入事件
    5. Observable.just(path)
    6. //对事件进行处理
    7. .map(new Function<String, Double>() {
    8. @Override
    9. public Double apply(@NonNull String s) throws Exception {
    10. return Double.parseDouble(s);
    11. }
    12. })
    13. //指定被观察者执行线程
    14. .subscribeOn(Schedulers.io())
    15. //指定观察者执行线程
    16. .observeOn(AndroidSchedulers.mainThread())
    17. //订阅观察者
    18. .subscribe(
    19. new Observer<Double>() {
    20. @Override
    21. public void onSubscribe(@NonNull Disposable d) {
    22. }
    23. @Override
    24. public void onNext(@NonNull Double aDouble) {
    25. }
    26. @Override
    27. public void onError(@NonNull Throwable e) {
    28. }
    29. @Override
    30. public void onComplete() {
    31. }
    32. });
    33. }

    Rxjava中的Scheduler相当于线程控制器,Rxjava通过它来指定每一段代码应该运行在什么样的线程。Rxjava提供了5种调度器:

    • .io()
    • .computation()
    • .immediate()
    • .newThread()
    • .trampoline()

    另外,Android还有一个专用的AndroidSchedulers.mainThread()指定操作将在Android主线程运行。Rxjava通过subscribeOn()和observeOn()两个方法来对线程进行控制,subscribeOn()指定subscribe()时间发生的线程,也就是事件产生的线程,observeOn()指定Subscriber做运行的线程,也就是消费事件的线程。

    Schedulers.io() 用于I/O操作,比如:读写文件,数据库,网络交互等等。行为模式和newThread()差不多,重点需要注意的是线程池是无限制的,大量的I/O调度操作将创建许多个线程并占用内存

    Schedulers.computation()计算工作默认的调度器,这个计算指的是 CPU 密集型计算,即不会被 I/O 等操作限制性能的操作,例如图形的计算。这个 Scheduler 使用的固定的线程池,大小为 CPU 核数。

    Schedulers.immediate()  这个调度器允许你立即在当前线程执行你指定的工作。这是默认的Scheduler。

    Schedulers.newThread()    它为指定任务启动一个新的线程。

    Schedulers.trampoline()

    当我们想在当前线程执行一个任务时,并不是立即,我们可以用trampoline() 将它入队。这个调度器将会处理它的队列并且按序运行队列中每一个任务。

    RXView 防抖

    1. private void test3() {
    2. RxView.clicks(控件).throttleFirst(1000, TimeUnit.MILLISECONDS).subscribe(new Observer() {
    3. @Override
    4. public void onSubscribe(@NonNull Disposable d) {
    5. }
    6. @Override
    7. public void onNext(@NonNull Object o) {
    8. Log.e(TAG, "onNext: 响应事件....." );
    9. }
    10. @Override
    11. public void onError(@NonNull Throwable e) {
    12. }
    13. @Override
    14. public void onComplete() {
    15. }
    16. });
    17. RxJava篇(应用场景) - 简书 (jianshu.com)

    18. 相关阅读:
      【设计模式】Java设计模式 - 原型模式
      SAP BW 常用知识点
      指定vscode黏贴图片路径(VSCode 1.79 更新)
      Node2vec
      教你使用processon快速绘制一张业务流程图?
      软件测试的几种方法
      NodeMCU ESP8266 基于Arduino IDE的串口图形化调试教程(超详细)
      6.jQuery中的Ajax上传文件
      从0开始的异世界编程 [3]
      【笔试实战】蓝桥官网在线刷题100题计划【第一轮】
    19. 原文地址:https://blog.csdn.net/xiaowang_lj/article/details/127428647
      • 最新文章
      • 攻防演习之三天拿下官网站群
        数据安全治理学习——前期安全规划和安全管理体系建设
        企业安全 | 企业内一次钓鱼演练准备过程
        内网渗透测试 | Kerberos协议及其部分攻击手法
        0day的产生 | 不懂代码的"代码审计"
        安装scrcpy-client模块av模块异常,环境问题解决方案
        leetcode hot100【LeetCode 279. 完全平方数】java实现
        OpenWrt下安装Mosquitto
        AnatoMask论文汇总
        【AI日记】24.11.01 LangChain、openai api和github copilot
      • 热门文章
      • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
        奉劝各位学弟学妹们,该打造你的技术影响力了!
        五年了,我在 CSDN 的两个一百万。
        Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
        面试官都震惊,你这网络基础可以啊!
        你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
        心情不好的时候,用 Python 画棵樱花树送给自己吧
        通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
        13 万字 C 语言从入门到精通保姆级教程2021 年版
        10行代码集2000张美女图,Python爬虫120例,再上征途
      Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
      正则表达式工具 cron表达式工具 密码生成工具

      京公网安备 11010502049817号