iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >使用RxJava中遇到的一些”坑“
  • 897
分享到

使用RxJava中遇到的一些”坑“

rxjava使用ava 2023-05-31 03:05:46 897人浏览 薄情痞子
摘要

前言大家越用RxJava,越觉得它好用,所以不知不觉地发现代码里到处都是RxJava的身影。然而,RxJava也不是银弹,其中仍然有很多问题需要解决。这里,我简单地总结一下自己遇到的一些“坑”,内容上可能会比较松散。一、考虑主线程的切换Rx

前言

大家越用RxJava,越觉得它好用,所以不知不觉地发现代码里到处都是RxJava的身影。然而,RxJava也不是银弹,其中仍然有很多问题需要解决。这里,我简单地总结一下自己遇到的一些“坑”,内容上可能会比较松散。

一、考虑主线程的切换

RxJava中一个常用的使用方法是——在其他线程中做处理,然后切换到UI线程中去更新页面。其中,线程切换就是使用了observeOn()。后台下载文件,前台显示下载进度就可以使用这种方式完成。然而,实践发现这其中有坑。如果文件比较大,而下载包的粒度又比较小,这将导致很多通知积压下来,最终导致错误。

这种错误其实也是可以理解的,毕竟MainLooper是根据Message来工作的,Message过多必然会导致一些问题。当然,这还是比较想当然的想法,最终还是需要到源码中一探究竟。ObserveOn的原理在前面关于RxJava的文章已经有过分析,这里还是简单列一下代码。其中的重点还是OperatorObserveOn的内部类——ObserveOnSubscriber。其重要代码片段如下:

  static final class ObserveOnSubscriber<T> extends Subscriber<T> implements Action0 {  final Subscriber<? super T> child;  final Scheduler.Worker recursiveScheduler;  final NotificationLite<T> on;  final boolean delayError;  final Queue<Object> queue;    final int limit;  // the status of the current stream  volatile boolean finished;  final AtomicLong requested = new AtomicLong();  final AtomicLong counter = new AtomicLong();    Throwable error;    long emitted;  // do NOT pass the Subscriber through to couple the subscription chain ... unsubscribing on the parent should  // not prevent anything downstream from consuming, which will happen if the Subscription is chained  public ObserveOnSubscriber(Scheduler scheduler, Subscriber<? super T> child, boolean delayError, int bufferSize) {   this.child = child;   this.recursiveScheduler = scheduler.createWorker();   this.delayError = delayError;   this.on = NotificationLite.instance();   int calculatedSize = (bufferSize > 0) ? bufferSize : RxRingBuffer.SIZE;   // this fORMula calculates the 75% of the bufferSize, rounded up to the next integer   this.limit = calculatedSize - (calculatedSize >> 2);   if (UnsafeAccess.isUnsafeAvailable()) {    queue = new SpscArrayQueue<Object>(calculatedSize);   } else {    queue = new SpscAtomicArrayQueue<Object>(calculatedSize);   }   // signal that this is an async operator capable of receiving this many   request(calculatedSize);  }  void init() {   // don't want this code in the constructor because `this` can escape through the   // setProducer call   Subscriber<? super T> localChild = child;   localChild.setProducer(new Producer() {    @Override    public void request(long n) {     if (n > 0L) {      BackpressureUtils.getAndAddRequest(requested, n);      schedule();     }    }   });   localChild.add(recursiveScheduler);   localChild.add(this);  }  @Override  public void onNext(final T t) {   if (isUnsubscribed() || finished) {    return;   }   if (!queue.offer(on.next(t))) {    onError(new MissingBackpressureException());    return;   }   schedule();  }  @Override  public void onCompleted() {   if (isUnsubscribed() || finished) {    return;   }   finished = true;   schedule();  }  @Override  public void onError(final Throwable e) {   if (isUnsubscribed() || finished) {    RxJavaHooks.onError(e);    return;   }   error = e;   finished = true;   schedule();  }  protected void schedule() {   if (counter.getAndIncrement() == 0) {    recursiveScheduler.schedule(this);   }  } }

--结束END--

本文标题: 使用RxJava中遇到的一些”坑“

本文链接: https://www.lsjlt.com/news/223113.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 使用RxJava中遇到的一些”坑“
    前言大家越用RxJava,越觉得它好用,所以不知不觉地发现代码里到处都是RxJava的身影。然而,RxJava也不是银弹,其中仍然有很多问题需要解决。这里,我简单地总结一下自己遇到的一些“坑”,内容上可能会比较松散。一、考虑主线程的切换Rx...
    99+
    2023-05-31
    rxjava 使用 ava
  • RxJava 1升级到RxJava 2过程中踩过的一些“坑”
    RxJava2介绍RxJava2 发布已经有一段时间了,是对 RxJava 的一次重大的升级,由于我的一个库cv4j使用了 RxJava2 来尝鲜,但是 RxJava2 跟 RxJava1 是不能同时存在于一个项目中的,逼不得已我得把自己所...
    99+
    2023-05-31
    rxjava1 升级 rxjava2
  • Spring中@RequestParam使用及遇到的一些坑
    目录加与不加的区别使用RequestParam遇到的一些坑(总结)总结加与不加的区别 @RequestMapping("/list1") public String test1(in...
    99+
    2024-04-02
  • 使用recvfrom函数遇到的坑有哪些
    使用recvfrom函数时可能会遇到以下几个常见的问题:1. 阻塞问题:recvfrom函数默认是阻塞的,即当没有收到数据时,程序会...
    99+
    2023-08-24
    recvfrom
  • BigDecimal遇到的坑有哪些
    这篇文章主要介绍“BigDecimal遇到的坑有哪些”,在日常操作中,相信很多人在BigDecimal遇到的坑有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”BigDec...
    99+
    2024-04-02
  • 使用try-catch-finally常遇到的坑有哪些
    本篇内容主要讲解“使用try-catch-finally常遇到的坑有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“使用try-catch-finally常遇到的坑有哪些”吧!坑1:final...
    99+
    2023-06-15
  • 解决在Unity中使用FairyGUI遇到的坑
    首先!首先!首先! 首先,我们由于历史问题,项目用的UI编辑器不是大众使用的GUI或者NGUI, 而是使用不知道算不算小众的FairyGUI,这个UI系统使用挺方便的,也提供了很多U...
    99+
    2024-04-02
  • 解决使用openpyxl时遇到的坑
    最近在用python处理Excel表格是遇到了一些问题 1, xlwt最多只能写入65536行数据, 所以在处理大批量数据的时候没法使用 2, openpyxl 这个库, 在使用的时...
    99+
    2024-04-02
  • spring cloud Feign使用@RequestLine遇到的坑
    Feign使用@RequestLine遇到的坑 如何在微服务项目中调用其它项目的接口试使用spring cloud feign声明式调用。 @FeignClient(name=...
    99+
    2024-04-02
  • python ConfigParser库的使用及遇到的坑
    目录ConfigParser库的使用及遇到的坑第一,先介绍write方法第二:书写成功下面就是readconfigparser.NoSectionError: No section:...
    99+
    2024-04-02
  • vuex中使用modules时遇到的坑及问题
    目录vuex使用modules时遇到的坑vuex中modules基本用法1. store文件结构3. app.js文件内容5. 配置main.jsvuex使用modules时遇到的坑...
    99+
    2024-04-02
  • 安装ingress-nginx遇到的一些坑实战记录
    目录环境:一、安装ingress-nginx二、修改deploy.yaml文件三、部署ingress-nginx总结环境: Linux:CentOS Linux release 7....
    99+
    2024-04-02
  • vue使用mui遇到的坑及解决
    目录使用mui遇到的坑记录mui的js冲突了,有2种解决方法方法1方法2使用mui遇到的坑记录 主要用到webpack打包工具与mui,mint ui,其中mui有不少坑,在此记录 ...
    99+
    2024-04-02
  • 使用flutter的showModalBottomSheet遇到的坑及解决
    目录遇到了三个比较坑的地方我们解决完后的效果如下解决问题一解决问题二解决问题三在使用官方的showModalBottomSheet这个组件时到目前为止 遇到了三个比较坑的地方 1. ...
    99+
    2024-04-02
  • 使用SpringBoot的CommandLineRunner遇到的坑及解决
    目录使用场景两个接口的不同特殊的场景遇到的坑填坑总结使用场景 再应用程序开发过程中,往往我们需要在容器启动的时候执行一些操作。 Spring Boot中提供了CommandLineR...
    99+
    2023-02-13
    使用SpringBoot CommandLineRunner的坑 SpringBoot CommandLineRunner
  • 使用c++11 constexpr时遇到的坑详解
    最近在使用constexpr的时候无意中踩了个小坑。 下面给个小示例: #include <iostream> constexpr int n = 10; cons...
    99+
    2024-04-02
  • Element UI table参数中的selectable的使用及遇到坑
    Element UI table参数中的selectable的使用中遇到的坑:页面: <el-table-column :selectable='selectable' ty...
    99+
    2024-04-02
  • 面试官问我,使用Dubbo有没有遇到一些坑?我笑了。
    前言17年的时候,因为一时冲动没把持住(当然最近也有粉丝叫我再冲动一把再更新一波),结合面试题写了一个系列的Dubbo源码解析.目前公众号大部分粉丝都是之前的粉丝,这里不过多介绍.根据我的面试经验而言,能在简历上写上原理、源码等关键词的,是...
    99+
    2023-06-05
  • 使用@Validated 和 BindingResult 遇到的坑及解决
    @Validated和BindingResult 使用遇到的坑 @Validated 与BindingResult 需要相邻,否则 变量result 不能接受错误信息 控制台输出 ...
    99+
    2024-04-02
  • 在python中使用[[v]*n]*n遇到的坑及解决
    目录使用[[v]*n]*n遇到的坑遇到的问题通过一番研究使用[[v]*n]*m遇到的问题需求:想通过python生成m行n列的矩阵使用[[v]*n]*n遇到的坑 今天通过[[v]*n...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作