【Android RxJava】RxJava学习记录1

Android中的RxJava 最近准备梳理一下Kotlin,先复习一遍RxJava思想,做个学习笔记+伪代码,整个脉络分为三个部分。 (一)使用场景 RxJava是重量级、最复杂的框架(没有之一),JakeWharton 的巅峰之作,操作符非常丰富、特别庞大,学关键的内容,学思维方式,看PPT资料,学两遍。 为什么要学习RxJava? 改变思维(Rx思维)来提升效率,响应式编程/异步事件流编程 Rx思维:起点(分发事件)—>…—>终点(消费事件),中间不会断掉且可以做拦截,链条式思维 学习资料 源码:JakeWhar. 阅读详情

1. 总览

1.1 基本原理

在这里插入图片描述
参考文献
在这里插入图片描述
构建流:每一步操作都会生成一个新的Observable节点(没错,包括ObserveOn和SubscribeOn线程变换操作),并将新生成的Observable返回,直到最后一步执行subscribe方法。编写Rxjava代码的过程其实就是构建一个一个Observable节点的过程
在这里插入图片描述
订阅流:从最后一个N5节点的订阅行为开始,依次执行前面各个节点真正的订阅方法。在每个节点的订阅方法中,都会生成一个新的Observer**,这个Observer会包含“下游”的Observer,这样当每个节点都执行完订阅(subscribeActual)后,也就生成了一串Observer,它们通过downstream,upstream引用连接
在这里插入图片描述
回调流: 当订阅流执行到最后,也就是第一个节点N0时,用onNext方法,两个作用,一个是把上个节点返回的数据进行一次map变换,另一个就是将map后的结果传递给下游。
在这里插入图片描述

参考这个视频
小结:先从上到下把各个变换的Observable连成链(拼装流水线),然后在最后subscribe的时候,又从下到上通过每个Observable的OnSubscribe从最下的Subscriber对象开始连成链(流水线开始工作包装Subscriber),直到顶端,当顶端的Subscriber对象调用了onNext方法的时候,又从上往下调用Subscriber链的onNext(用户一层层拆开包装盒),里面执行了每个操作的变换逻辑。

1.2 导入包和依赖

implementation 'io.reactivex.rxjava2:rxjava:2.2.21'
implementation 'io.reactivex.rxjava2:rxandroid:2.1.1'

2. 操作符

添加链接描述

2.1 创建操作符

  • Create
    private void test1() {
    //被观察者Observable;观察者Observer/消费者consumer;通过subsribe订阅
        Observable.create(new ObservableOnSubscribe<Object>() {
            @Override
            public void subscribe(ObservableEmitter<Object> emitter) throws Exception {
                emitter.onNext("1");
//                emitter.onError(new Throwable("异常模拟"));
                emitter.onComplete();
            }
        }).subscribe(new Observer<Object>() {
            @Override
            public void onSubscribe(Disposable d) {
                System.out.println("subscribe");
            }
            @Override
            public void onNext(Object o) {
                System.out.println("onNext Observer " + o);
            }
            @Override
            public void onError(Throwable e) {
                System.out.println("erro");
            }
            @Override
            public void onComplete() {
                System.out.println("Complete Observer....");
            }
        });
    }


    private void test2() {
        Disposable d = Observable.create(new ObservableOnSubscribe<Object>() {
            @Override
            public void subscribe(ObservableEmitter<Object> emitter) throws Exception {
                emitter.onNext("2");
                emitter.onError(new Throwable("模拟异常"));
                emitter.onComplete();
            }
        }).subscribe(new Consumer<Object>() {
            @Override
            public void accept(Object o) throws Exception {
                System.out.println("Accept " + o);
            }
        }, new Consumer<Throwable>() {
            @Override
            public void accept(Throwable throwable) throws Exception {
                System.out.println("Accept " + throwable);
            }
        });
    }

Observer:
适合需要完整事件处理的场景,包括处理数据、错误和完成信号。
提供了更灵活的事件处理能力,可以根据需求实现对错误和完成事件的响应。
Consumer:
适合简单的场景,只需处理每个发出的数据项,而不需要关心错误或完成事件。
简化了代码结构,特别是在处理简单流时,使用起来更为便捷和直观。

  • 其他
    just 10个发射源
    from 将一个Iterable、一个Future、 或者一个数组,内部通过代理的方式转换成一个Observable
    interval操作符 创建一个按固定时间间隔发射整数序列的Observable,这个序列为一个无限递增的整数序列
    range操作符 发射一个范围内的有序整数序列,并且我们可以指定范围的起始和长度
    repeat操作符 重复发射原始Observable的数据序列,这个序列或者是无限的,或者通过repeat(n)指定重复次数

2.2 转换操作符

map
将源Observable发送的数据转换为一个新的Observable对象

    private void test3(){
        Observable.just("111")
                .map(new Function<String, Object>() {
                    @Override
                    public Object apply(String s) throws Exception {
                        return "my name is " + s;
                    }
                }).subscribe(ob);
    }
   //subscribe
//onNext Observer my name is 111
//Complete Observer....

flatmap
添加链接描述
在这里插入图片描述
将一个发送事件的上游Observable变换为多个发送事件的Observables,然后将它们发射的事件合并后放进一个单独的Observable里(但是是无序的)

    private void test4(){
        Disposable ob = Observable.create(new ObservableOnSubscribe<Integer>() {
            @Override
            public void subscribe(ObservableEmitter<Integer> emitter) throws Exception {
                emitter.onNext(1);
                emitter.onNext(2);
                emitter.onNext(3);
            }
        }).flatMap(new Function<Integer, ObservableSource<String>>() {
            @Override
            public ObservableSource<String> apply(Integer o) throws Exception {
                final List<String> list = new ArrayList<>();
                for (int i = 0; i < 3; i++) {
                    list.add("I am value " + o);
                }
                return Observable.fromIterable(list).delay(10, TimeUnit.MILLISECONDS);//为了无序 加了延迟
            }
        }).subscribe(new Consumer<String>() {
            @Override
            public void accept(String o) throws Exception {
                System.out.println(o);
            }
        });
    }
    //出现的 1 2 3会随机出现

concatMap
concatMap操作符类似于flatMap操作符,不同的一点是它按次序连接。
map和flatmap的核心区别就是map是对原来事件进行处理,还是原来的被观察者;flatmap返回了一个新的被观察者。
在这里插入图片描述
在这里插入图片描述

2.3 组合操作符

concat
concatArray
合并多个对象,按照一定的顺序
在这里插入图片描述
merge
在这里插入图片描述

2.4 功能操作符)

SubscribeOn 改变调用它之前代码的线程,只有第一次有效(从流的角度去理解) ObserveOn 改变调用它之后代码的线程, 可以多次调用 (从流的角度去理解)
        Observable.create(new ObservableOnSubscribe<Object>() {
                    @Override
                    public void subscribe(ObservableEmitter<Object> emitter) throws Exception {
                        Log.d(TAG,"加了subscribeOn和observeOn: " + Thread.currentThread().getName());
                        emitter.onNext("1111");
                        emitter.onNext("22222");
                        emitter.onComplete();
                    }
                })
               .subscribeOn(Schedulers.newThread()) //1 进行创建和发射在子线程
                .observeOn(AndroidSchedulers.mainThread())// 2 在主线程消费;由于程序是test里面执行,所以不是main线程;后续改成了main是一样的道理

                .subscribe(new Observer<Object>() {
                    @Override
                    public void onSubscribe(Disposable d) {
                        Log.d(TAG,"onSubscribe " + Thread.currentThread().getName());
                    }

                    @Override
                    public void onNext(Object o) {
                        Log.d(TAG,"onNext " + Thread.currentThread().getName());

                    }

                    @Override
                    public void onError(Throwable e) {
                        Log.d(TAG,"onError " + Thread.currentThread().getName());
                    }

                    @Override
                    public void onComplete() {
                        Log.d(TAG,"onComplete " + Thread.currentThread().getName());
                    }
                });
    }

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
这一个onSubsribe 一直是在测试线程里


1. **Observable 的创建和订阅**:
   - 在 `subscribe()` 方法中,你创建了一个 `Observer` 对象,并将其订阅到了 `Observable` 对象上。

2. **onSubscribe 方法执行**:
   - 当 `subscribe()` 方法被调用后,`Observer` 对象的 `onSubscribe` 方法会立即执行。这是因为 `onSubscribe` 是 `Observer` 接口的一部分,它负责接收 `Disposable` 对象,表示订阅关系,而不是响应数据流本身。

3. **异步操作执行**:
   - 然后,`Observable` 中的异步操作开始执行。在你的例子中,通过 `Observable.create()` 创建了一个新的数据流,该数据流会在新线程(通过 `subscribeOn(Schedulers.newThread())` 指定的线程)中执行。这意味着 `Observable.create()` 中的代码块会在新线程中运行,而不会阻塞主线程。

4. **数据流发射和消费**:
   - 在新线程中,`ObservableEmitter` 会发射数据项(通过 `emitter.onNext()` 发送数据)并在合适的时机调用 `onComplete()` 或者 `onError()`,表示数据流的结束。

5. **observeOn 切换到主线程**:
   - 通过 `observeOn(AndroidSchedulers.mainThread())`,确保在数据流中的消费者部分(即 `Observer` 的 `onNext()`, `onError()`, `onComplete()` 方法)在主线程中执行。这个切换保证了在主线程更新UI或处理数据,从而避免了在主线程中执行耗时操作而导致的UI阻塞问题。

2.5 过滤操作符

Filter

    public void test7(){
        //filter过滤操作符,对Observable发送的内容根据自定义的规则进行过滤
        Observable.range(0, 5).filter(new Predicate<Integer>() {
                    @Override
                    public boolean test(Integer integer) throws Exception {
                        return integer>2;
                    }
                })
                .subscribe(ob);

    }

3. 设计模式

在这里插入图片描述
在这里插入图片描述
RxJava的观察者模式具体形式:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
(结合第一节中三种流的示意图来理解)

4. 内存泄漏

4.1 问题描述

使用RxJava发布一个订阅后,当Activity被finish,此时订阅逻辑还未完成,如果没有及时取消订阅,就会导致Activity无法被回收,从而引发内存泄漏。
具体例子:

public class SecondActivity extends AppCompatActivity {
    Disposable subscribe;
    @Override
    protected void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        subscribe = Observable.create(new ObservableOnSubscribe<Object>() {
                    @Override
                    public void subscribe(ObservableEmitter<Object> emitter) throws Exception {
                        Log.i("TAG", "开始请求数据...");
                        Thread.sleep(5000);
                        Log.i("TAG", "数据请求结束...");
                        emitter.onNext("success!!!");
                        emitter.onComplete();
                    }
                }).subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Consumer<Object>() {
                    @Override
                    public void accept(Object o) throws Exception {
                        Log.i("TAG", "accept " + o);
                    }
                });
    }
}

使用MainAcitivity启动这个Activity,然后快速退出(5s内),输出如下:
在这里插入图片描述
这个结果说明就算退出了,程序还是在输出,造成内存泄漏。
(PS:模拟过程中遇到一个很奇怪的问题 :直接手机关闭 主activity 不会出现泄漏,是AS自己做了优化吗?
)

4.2 解决方案

解决方案一:
直接在Destroy方法里面取消订阅,不推荐,activity多了不好处理

   @Override
   protected void onDestroy() {
       super.onDestroy();
      subscribe.dispose();
   }

解决方案二:
对一的改进,引入一个新变量,可以对disposable进行add,然后批量处理,还是不够优雅

public class SecondActivity extends AppCompatActivity {
    Disposable subscribe;
    CompositeDisposable compositeDisposable;
    @Override
    protected void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        subscribe = Observable.create(new ObservableOnSubscribe<Object>() {
                    @Override
                    public void subscribe(ObservableEmitter<Object> emitter) throws Exception {
                        Log.i("TAG", "开始请求数据...");
                        Thread.sleep(5000);
                        Log.i("TAG", "数据请求结束...");
                        emitter.onNext("success!!!");
                        emitter.onComplete();
                    }
                }).subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Consumer<Object>() {
                    @Override
                    public void accept(Object o) throws Exception {
                        Log.i("TAG", "accept " + o);
                    }
                });
        compositeDisposable.add(subscribe);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
//        subscribe.dispose();
        compositeDisposable.dispose();
    }
}

解决方案三:
引入RxLifeCycle
(1)
使用ActivityEvent类,其中的CREATE、START、 RESUME、PAUSE、STOP、 DESTROY分别对应生命周期内的方法。使用bindUntilEvent指定在哪个生命周期方法调用时取消订阅:

public class SecondActivity extends RxAppCompatActivity { //继承RxAPP
    Disposable subscribe;
    @Override
    protected void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        subscribe = Observable.create(new ObservableOnSubscribe<Object>() {
                    @Override
                    public void subscribe(ObservableEmitter<Object> emitter) throws Exception {
                        Log.i("TAG", "开始请求数据...");
                        Thread.sleep(5000);
                        Log.i("TAG", "数据请求结束...");
                        emitter.onNext("success!!!");
                        emitter.onComplete();
                    }
                })
                  .doOnDispose(new Action() {
                    @Override
                    public void run() throws Exception {
                        Log.i("TAG","is doOnDispose....");
                    }
                })
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .compose(this.bindUntilEvent(ActivityEvent.STOP)) //关键代码
                .subscribe(new Consumer<Object>() {
                    @Override
                    public void accept(Object o) throws Exception {
                        Log.i("TAG", "accept " + o);
                    }
                });
    }


}

(2)
以Activity为例,在Activity中使用bindToLifecycle()方法,完成Observable发布的事件和当前的组件绑定,实现生命周期同步。从而实现当前组件生命周期结束时,自动取消对Observable订阅,代码如下:

            .compose(this.<Long>bindToLifecycle())
揭秘移动开发领域 RxJava 的核心原理 本文聚焦 RxJava 最核心的设计思想与运行原理,覆盖观察者模式链式调用机制线程调度原理操作符实现逻辑四大模块。通过生活类比、代码示例与流程图解,帮助开发者从“会用”进阶到“理解为什么这样用”。本文以“点外卖”场景贯穿始终,先通过生活案例引出核心概念,再拆解概念间的协作关系,接着用代码和流程图解析底层原理,最后结合实际开发场景说明应用价值。当调用创建订阅链:Observable 会包装成一个“订阅任务”,传递给下游的操作符(如果有的话);反向订阅。 阅读详情

相关推荐

优化Android RxJava2堆栈跟踪

本文还有配套的精品资源,点击获取 简介:RxJava是Android开发中处理异步数据流的反应式编程库。在错误处理和调试中,理解堆栈跟踪是关键。本主题探讨如何通过RxJava2的 rxjava-tracing 模块和自定义插件改善堆栈跟踪信息,以便更有效地定位和解决问题。例如,通过 RxJavaPlugins 的自定义错误处理器和第三方库 ...

weixin_33670640的博客 1139

android--RXJava详细使用篇

人性的背后是白云苍狗,愿我们都能做生活的高手

袁震的博客 4554

LangChain实战:用FAISS搭建本地文档问答系统(含Word文件处理避坑指南)

本文详细介绍了如何利用LangChain框架和FAISS向量数据库构建本地化智能文档问答系统,特别针对Word文档处理中的技术难点提供实用解决方案。通过模块化设计、本地化支持和多格式兼容,实现高效文档处理与精准问答,满足企业对数据隐私和安全的需求。

o4p5q6r7s的博客 408

给 Android 开发者的 RxJava 详解

前言 我从去年开始使用 RxJava ,到现在一年多了。今年加入了 Flipboard 后,看到 Flipboard 的 Android 项目也在使用 RxJava ,并且使用的场景越来越多 。而最近这几个月,我也发现国内越来越多的人开始提及 RxJava 。有人说『RxJava 真是太好用了』,有人说『RxJava 真是太难用了』,另外更多的人表示:我真的百度了也谷歌了,但我还是想问: RxJava 到底是什么? 鉴于 RxJava 目前这种既火爆又神秘的现状,而我又在一年的使用过程中对 RxJa..

青岛海珊瑚IT学习中心 3376

变色龙哈希函数 Chameleon Hash 可变型区块链

哈希函数 Hash: 众所周知,区块链有着极其优秀的安全性就是因为其充分使用了哈希函数。 哈希简单用一句话来讲,就是:将任意长度输入的字串可转换成一个固定长度的字串,通过原始字串可以很容易地算出转换后的字串,通过转换后的字串很难还原出原始字串。 哈希函数特征: 1. 对于任意m作为输入,得到输出的结果,很难找到另一个输入m'  (m'不等于m),使得m'的Hash结果也为同样的输出

新手村 1万+

RagFlow实战:如何用DeepDoc引擎高效处理扫描PDF文档(附完整代码解析)

本文详细解析了如何利用RagFlow的DeepDoc引擎高效处理扫描PDF文档。通过实战演示从环境搭建、PDF预处理、文本检测与识别,到布局分析与表格结构提取的完整流程,并提供了完整的代码实现。该方案超越了传统OCR,能输出保留原始版面信息的结构化数据,为构建高质量知识库提供了强大支持。

weixin_29245767的博客 300

android——rxjava的使用(连续多个弹窗的处理)

本文介绍项目开发中使用到rxjava的情形,以及详细的代码。RxJava是一个基于Java语言的Reactive Extensions库,它用于实现异步编程和流式处理,通过将事件和数据流以数据序列的形式进行处理,提高了代码的可读性和可维护性。

wy313622821的博客 3542

生物信息学名词解释 | K-mer (长度为k的短序列)

K-mer 何谓K-mer 所谓Kmer,即为一段长度为k的DNA片段,是由测序reads剪切一部分得到的。k为一个奇数,k=几,就为几mer。 比如:我的测序reads长度为100bp,我将这100bp打断成17bp的短片段,打断后的17bp段片段就叫17mer,可以获得(100-17+1)条k-mer序列。 Table1 k-mers for GTAGAGCTGT. k k-mers 1 G,T,A,G,A,G,C,T,G,T 3 GTA,TAG,AGA,GAG,AGC,GCT,CT

qq_50637636的博客 2万+

RxJava2替换RxJava1遇到的问题记录

【转载请注明出处:李诗雨】 不诗意的女程序猿不是好厨师~ 最初是在同学的指导下开始使用RxJava的,那时使用的还是RxJava1,现在发现RxJava2相对于RxJava1更好用,于是便换成了RxJava2。期间遇到了一些问题,在这里做个记录。 恩,天真无鞋的我以为只要在gradle文件中改下配置,就完成了RxJava1到RxJava的升级了,可是事实并不是这个样子的。

cjm2484836553的博客 1617

黑金ZYNQ7010开发板开箱实测:从接线到串口通信的保姆级指南

本文提供黑金ZYNQ7010开发板从开箱到串口通信的完整实操指南。详细介绍了硬件连接、驱动安装、启动模式设置及串口终端配置等关键步骤,并针对常见问题提供排查思路,帮助FPGA开发者快速上手ZYNQ平台,建立稳定的调试通道。

weixin_29266749的博客 466

Buck的振铃实验与分析

上上期我们提到了buck电路的开关的振铃波形,本质原因是LC的阻尼振荡。文章偏理论,那BUCK到底是怎么产生尖峰振荡呢? 要想把这个问题搞清楚,也很是不容易,所以文章有点长,请直接点赞转发加收藏。 问题 本期主要分析以下这两个问题: 1、死区时间是什么?这里有个小台阶是什么情况? 2、上下尖峰振荡是如何产生的?跟哪些因素有关? 理想的BUCK的SW波形 我们由浅入深,一步一步来,先看理想的开关SW波形—没有尖峰电压的波形。 为了能更好的看buck电路各个点的电压电流情况.

weixin_42005993的博客 3万+

RxJava在Android中学习记录之一

RxJava学习记录之一前言基本语法Android项目中引入RxjavaRxJava的Hello Word 前言 记录在Android项目中RxJava的学习使用,以及遇到的一些问题 本记录可能会持续很久,尽量完善 基本语法 Android项目中引入Rxjava 想在项目中使用RxJava,首先我们要引入需要用的框架包 可以直接这么写 compile 'io.reactivex.rxjav...

dzy_mails的专栏 185

【同等学力】2025-数学✨

本文主要涵盖了谓词逻辑、集合论、图论和排列组合等多个数学领域的题目。在谓词逻辑部分,要求用全称量词和存在量词表达“没有两个人的指纹完全相同”。集合论部分涉及集合运算的证明,如证明(A-B)-C=(A-C)-(B-C)。图论部分包括计算给定10个点的联通图的边与面数。排列组合部分则要求计算从8个人中选6个并分为三组的不同方法。此外,还涉及偏序、长链、反链、二项式定理等相关内容,参考了多个优快云博客中的解题思路。

super_mochi1 676

每天记录学习的新知识:RxJava1

作者:扔物线 《给 Android 开发者的 RxJava 详解》:https://gank.io/post/560e15be2dca930e00da1083#toc_14 仰望一下上面的作者,说声谢谢。 扩展:Retrolambda 自我介绍 一个词:异步 &amp;amp;amp;quot;a library for composing asynchronous and event-based programs using...

嗯... 684

3 路由引入

在大型企业网络中,网络规模十分庞大,选用单一的路由协议无法满足网络的需求,因此多种路由协议共存的情况十分常见。或者出于业务逻辑或行政管理的考虑,会在不同的网络结构中设计和部署不同的路由协议,使路由的层次结构更加清晰可控。路由引入是具有方向性的,将路由信息从路由协议A引入到路由协议B(A-to-B),则路由协议B可获知A中的路由信息,但是此时,A还并不知晓B路由协议中的路由信息,除非配置B-to-A的路由引入。表3-1:各种路由协议的优先级。通过路由引入,可以实现路由信息在不同路由协议间传递。

lwljh134的博客 621

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Android中调试RxJava

是一个切入点,我们知道它是如何令人沮丧和痛苦的。此外,很多时候你为了写调试相关的代码(不属于业务逻辑的部分)而使得事情更复杂。特别是当涉及到异步代码执行。 Frodo就是为了避免编写用于调试RxJava对象的代码而出现的。它依赖Java注解和Gradle Plugin,程序Debug编译时会检测,它会将RxJava对象的相关信息输出到logcat。例如,即使是在生成release版的app时

白马笑西风的专栏 2375

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

android RxJava(RxAndroid)的简单使用

今天,简单讲讲android里如何使用RxJava(RxAndroid)。   Android框架系列: 一.android EventBus的简单使用 二.android Glide简单使用 三.android OKHttp的基本使用详解 四.android RxJava(RxAndroid)的简单使用   可能大家听都没有听说过这个框架,但是现在其实已经很火了。在面试时,很多公...

谢岩的博客 1万+

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

android rxjava作用,Android-RxJava

RxJava在Android的开发里,一般用于网络请求,配合retrofit和OKhttp。OKhttp:真正发生网络请求的地方。retrofit:一个网络请求的框架,底层实现是OKhttp,使用retrofit框架的目的就是使得我们的网络请求更加易用。RxJava:也是一个框架,目的是解决任务的同步和异步执行,同时还可以通过多种多样的操作符,实现不同的需求。题外话:现在协程的作用,跟RxJava...

weixin_31502485的博客 781

android——retrofit+rxjava超级详细讲解与使用

在自我学习的过程中,和项目中,使用到了retrofit+rxjava访问接口,记录一下自己的学习过程,可能有不准确或者不到位的地方,请指正,嘻嘻!!!

weixin_45552475的博客 9991

Android 中 Retrofit 结合 RxJava使用

最近在学习一些关于 RxJava 和 Retrofit 的相关内容,通过 给 Android 开发者的 RxJava 详解 这篇文章对RxJava 有了一些了解,接着通过 ReactiveX 中文文档 了解了一些相关概念和思想,然后通过 Retrofit 官网 和 Retrofit 在GitHub上的例子 简单了解了Retrofit 的使用,在使用 Retrofit 之前,需要先了解下 RESTf

classTC的博客 2047

Android 面试知识点记录——Rxjava与协程

背压(Backpressure)是指当数据产生速度大于消费速度,程序处理不过来是消息就会出现堆积。从而导致内存溢出、程序崩溃等问题。这种情况被称为背压问题逻辑上的改进办法生产者数量=消费者数量节流,丢弃一部分请求打包,把所有事件封装在一个集合中发送Rxjava1.x的时候没有对背压的支持,只提供了onBackpressureBuffer(time)、onBackpressureDrop() 等)来缓解背压问题,但这些解决方案都只是对数据流进行了缓存或者丢弃处理。

1 1056

Android RxJava学习记录(一)

看了一些RxJava的技术博客,发现有位大神写得很简明形象,深感佩服! 教程地址 -->https://www.jianshu.com/u/c50b715ccaeb 此处记录一下学习过程中一些重要的点: (一)https://www.jianshu.com/p/464fa025229e 1、onComplete 和onError唯一并且互斥。发送多个onComplete是...

KWMax 263

Kotlin-Android开发之开源《新闻APP》基于MVP模式+Retrofit2.0+RxJava1.0+Dagger2框架

前言:此项目是一个适合刚入门安卓开发的且熟悉Kotlin的练手小项目,基于《Kotlin-Android开发之MVP模式+Retrofit2.0+RxJava1.0+Dagger2框架封装》开发而成,实现了新闻的分类浏览、历史记录、我的收藏以及小视频的播放,新闻数据来源《聚合数据-开发者数据API开放平台》,大家注册个账号就可以免费使用新闻的api,视频的内容来源我的毕设项目。下拉刷新和上滑加载更...

等待着冬天的风的博客 1199

RxJava学习历程

RxJava也火了好久了,网上介绍的博文也很多,在此谨记录自己学习的一些理解和心得,可能有些地方说的不一定对的。谨此记录而已。 先附上友链给 Android 开发者的 RxJava 详解、大头鬼. 再次声明。博文谨代表我个人的理解,若误认子弟,概不负责。当然,也不一定有多少人会看到我这篇博文了,还是在此自恋一下。RxJava采用的是观察者模式,同时面向接口编程,利用回调实现了被观察变化后观察者能

黄兴丽的专栏 770

android java.rmi不存在_Android Room + RxJava 查询记录不存在的处理方法

Android Room + RxJava 查询记录不存在的处理方法Author: nex3z2017-10-31Android 的 Room Persistence Library 提供了一层对 SQLite 的抽象,通过 Room RxJava,Room 可以直接返回 RxJava 的 Publisher 和 Flowable 对象,极大地方便了对数据库的访问。使用 Room RxJava 时...

weixin_42109732的博客 481

RxJava 1升级到RxJava 2 部分内容修改

RxJava2相比RxJava1,它的改动还是很大的,那么下面这篇文章主要给大家总结了在RxJava 1升级到RxJava 2过程中的一些改动,文中介绍的非常详细,对大家具有一定的参考学习价值,需要的朋友们下来要一起看看吧。 RxJava2介绍 RxJava2 发布已经有一段时间了,是对 RxJava 的一次重大的升级,由于我的一个库cv4j使用了 RxJava2 来尝鲜,但是 RxJava2...

wo604838731的专栏 304
上一篇: [Android基础] 学习记录1
下一篇: [Git使用] 基础2
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值