【Android学习】RxJava

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

资料连接

Android RxJava: 这是一份全面的 操作符 使用汇总 (含详细实例讲解)

1. Merge & Zip操作符: 合并数据源

Android RxJava应用:合并数据源
在这里插入图片描述

2. Map & FlapMap & ConcatMap & Buffer: 变换操作符

Android RxJava应用:变换操作符
在这里插入图片描述

3. retry & retryUntil & retryWhen : 错误处理操作符

  • retry
    retry(): 让被观察者重新发射数据,要是一直错误就一直发送了
    retry(BiPredicate): interger是第几次重新发送,Throwable是错误的内容
    retry(long time): 最多让被观察者重新发射数据多少次
    retry(long time,Predicate predicate): 最多让被观察者重新发射数据多少次,在predicate里面进行判断拦截 返回是否继续
    retry(Predicate predicate): 在predicate里面进行判断拦截 返回是否继续
  • retryUntil
    具体使用类似于retry(Predicate predicate),唯一区别:返回 true 则不重新发送数据事件。此处不作过多描述
  • retryWhen
  • 遇到错误时,将发生的错误传递给一个新的被观察者(Observable),并决定是否需要重新订阅原始被观察者(Observable)& 发送事件
    注意:
    retryWhen 通过 flatMap 返回的 Observable.just(1) 仅仅作为一个信号(同样会被onNext方法捕获),触发了原始的 Observable 重新订阅,从而重新执行 onNext(1) 和 onNext(2)
Observable.create(new ObservableOnSubscribe<Integer>() {
            @Override
            public void subscribe(ObservableEmitter<Integer> e) throws Exception {
                e.onNext(1);
                e.onNext(2);
                e.onError(new Exception("发生错误了"));
                e.onNext(3);
            }
        })
                // 遇到error事件才会回调
                .retryWhen(new Function<Observable<Throwable>, ObservableSource<?>>() {
                    
                    @Override
                    public ObservableSource<?> apply(@NonNull Observable<Throwable> throwableObservable) throws Exception {
                        // 参数Observable<Throwable>中的泛型 = 上游操作符抛出的异常,可通过该条件来判断异常的类型
                        // 返回Observable<?> = 新的被观察者 Observable(任意类型)
                        // 此处有两种情况:
                            // 1. 若 新的被观察者 Observable发送的事件 = Error事件,那么 原始Observable则不重新发送事件:
                            // 2. 若 新的被观察者 Observable发送的事件 = Next事件 ,那么原始的Observable则重新发送事件:
                        return throwableObservable.flatMap(new Function<Throwable, ObservableSource<?>>() {
                            @Override
                            public ObservableSource<?> apply(@NonNull Throwable throwable) throws Exception {

                                // 1. 若返回的Observable发送的事件 = Error事件,则原始的Observable不重新发送事件
                                // 该异常错误信息可在观察者中的onError()中获得
                                 return Observable.error(new Throwable("retryWhen终止啦"));
                                
                                // 2. 若返回的Observable发送的事件 = Next事件,则原始的Observable重新发送事件(若持续遇到错误,则持续重试)
                                 // return Observable.just(1);
                            }
                        });

                    }
                })
                .subscribe(new Observer<Integer>() {
                    @Override
                    public void onSubscribe(Disposable d) {

                    }
                    @Override
                    public void onNext(Integer value) {
                        Log.d(TAG, "接收到了事件"+ value  );
                    }

                    @Override
                    public void onError(Throwable e) {
                        Log.d(TAG, "对Error事件作出响应" + e.toString());
                        // 获取异常错误信息
                    }

                    @Override
                    public void onComplete() {
                        Log.d(TAG, "对Complete事件作出响应");
                    }
                });

4. Transformer & Compose 转换操作符

Transformer 在RxJava中的使用

  • 定义
    Transformer 是一个接口,用于创建一个操作符,可以将一个 Observable 转换为另一个 Observable。通常,Transformer 是通过实现 ObservableTransformer<T, R> 接口来创建的。
  • 使用场景
    当你需要在多个地方重用相同的操作链时,使用 Transformer 可以将一系列操作封装成一个可复用的单元。
  • 代码
public class MyTransformer<T> implements ObservableTransformer<T, T> {
    @Override
    public ObservableSource<T> apply(Observable<T> upstream) {
        return upstream
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .map(value -> value + " transformed");
    }
}

// 使用
observable.compose(new MyTransformer<>()).subscribe(...);

在这里插入图片描述

5. 网络请求嵌套回调 FlatMap

网络请求嵌套回调
场景:需要进行嵌套网络请求:即在第1个网络请求成功后,继续再进行一次网络请求
解决方案:在第一个请求doOnNext方法后,flatMap 发起第二个请求

public class MainActivity extends AppCompatActivity {

        private static final String TAG = "Rxjava";
        // 定义Observable接口类型的网络请求对象
        Observable<Translation1> observable1;
        Observable<Translation2> observable2;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);

            // 步骤1:创建Retrofit对象
            Retrofit retrofit = new Retrofit.Builder()
                    .baseUrl("http://fy.iciba.com/") // 设置 网络请求 Url
                    .addConverterFactory(GsonConverterFactory.create()) //设置使用Gson解析(记得加入依赖)
                    .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) // 支持RxJava
                    .build();

            // 步骤2:创建 网络请求接口 的实例
            GetRequest_Interface request = retrofit.create(GetRequest_Interface.class);

            // 步骤3:采用Observable<...>形式 对 2个网络请求 进行封装
            observable1 = request.getCall();
            observable2 = request.getCall_2();


            observable1.subscribeOn(Schedulers.io())               // (初始被观察者)切换到IO线程进行网络请求1
                       .observeOn(AndroidSchedulers.mainThread())  // (新观察者)切换到主线程 处理网络请求1的结果
                       .doOnNext(new Consumer<Translation1>() {
                        @Override
                        public void accept(Translation1 result) throws Exception {
                            Log.d(TAG, "第1次网络请求成功");
                            result.show();
                            // 对第1次网络请求返回的结果进行操作 = 显示翻译结果
                        }
                    })

                    .observeOn(Schedulers.io())                 // (新被观察者,同时也是新观察者)切换到IO线程去发起登录请求
                                                                // 特别注意:因为flatMap是对初始被观察者作变换,所以对于旧被观察者,它是新观察者,所以通过observeOn切换线程
                                                                // 但对于初始观察者,它则是新的被观察者
                    .flatMap(new Function<Translation1, ObservableSource<Translation2>>() { // 作变换,即作嵌套网络请求
                        @Override
                        public ObservableSource<Translation2> apply(Translation1 result) throws Exception {
                            // 将网络请求1转换成网络请求2,即发送网络请求2
                            return observable2;
                        }
                    })

                    .observeOn(AndroidSchedulers.mainThread())  // (初始观察者)切换到主线程 处理网络请求2的结果
                    .subscribe(new Consumer<Translation2>() {
                        @Override
                        public void accept(Translation2 result) throws Exception {
                            Log.d(TAG, "第2次网络请求成功");
                            result.show();
                            // 对第2次网络请求返回的结果进行操作 = 显示翻译结果
                        }
                    }, new Consumer<Throwable>() {
                        @Override
                        public void accept(Throwable throwable) throws Exception {
                            System.out.println("登录失败");
                        }
                    });
    }
}

6. 网络请求出错重连 Retrywhen

网络请求出错重连

public class RxJavafixRetrofit2 extends AppCompatActivity {

    private static final String TAG = "RxJava";

    // 设置变量
    // 可重试次数
    private int maxConnectCount = 10;
    // 当前已重试次数
    private int currentRetryCount = 0;
    // 重试等待时间
    private int waitRetryTime = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 步骤1:创建Retrofit对象
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("http://fy.iciba.com/") // 设置 网络请求 Url
                .addConverterFactory(GsonConverterFactory.create()) //设置使用Gson解析(记得加入依赖)
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) // 支持RxJava
                .build();

        // 步骤2:创建 网络请求接口 的实例
        GetRequest_Interface request = retrofit.create(GetRequest_Interface.class);

        // 步骤3:采用Observable<...>形式 对 网络请求 进行封装
        Observable<Translation> observable = request.getCall();

        // 步骤4:发送网络请求 & 通过retryWhen()进行重试
        // 注:主要异常才会回调retryWhen()进行重试
        observable.retryWhen(new Function<Observable<Throwable>, ObservableSource<?>>() {
            @Override
            public ObservableSource<?> apply(@NonNull Observable<Throwable> throwableObservable) throws Exception {
                // 参数Observable<Throwable>中的泛型 = 上游操作符抛出的异常,可通过该条件来判断异常的类型
                return throwableObservable.flatMap(new Function<Throwable, ObservableSource<?>>() {
                    @Override
                    public ObservableSource<?> apply(@NonNull Throwable throwable) throws Exception {

                        // 输出异常信息
                        Log.d(TAG,  "发生异常 = "+ throwable.toString());

                        /**
                         * 需求1:根据异常类型选择是否重试
                         * 即,当发生的异常 = 网络异常 = IO异常 才选择重试
                         */
                        if (throwable instanceof IOException){

                            Log.d(TAG,  "属于IO异常,需重试" );

                            /**
                             * 需求2:限制重试次数
                             * 即,当已重试次数 < 设置的重试次数,才选择重试
                             */
                            if (currentRetryCount < maxConnectCount){

                                // 记录重试次数
                                currentRetryCount++;
                                Log.d(TAG,  "重试次数 = " + currentRetryCount);

                                /**
                                 * 需求2:实现重试
                                 * 通过返回的Observable发送的事件 = Next事件,从而使得retryWhen()重订阅,最终实现重试功能
                                 *
                                 * 需求3:延迟1段时间再重试
                                 * 采用delay操作符 = 延迟一段时间发送,以实现重试间隔设置
                                 *
                                 * 需求4:遇到的异常越多,时间越长
                                 * 在delay操作符的等待时间内设置 = 每重试1次,增多延迟重试时间1s
                                 */
                                // 设置等待时间
                                waitRetryTime = 1000 + currentRetryCount* 1000;
                                Log.d(TAG,  "等待时间 =" + waitRetryTime);
                                return Observable.just(1).delay(waitRetryTime, TimeUnit.MILLISECONDS);


                            }else{
                                // 若重试次数已 > 设置重试次数,则不重试
                                // 通过发送error来停止重试(可在观察者的onError()中获取信息)
                                return Observable.error(new Throwable("重试次数已超过设置次数 = " +currentRetryCount  + ",即 不再重试"));

                            }
                        }

                        // 若发生的异常不属于I/O异常,则不重试
                        // 通过返回的Observable发送的事件 = Error事件 实现(可在观察者的onError()中获取信息)
                        else{
                            return Observable.error(new Throwable("发生了非网络异常(非I/O异常)"));
                        }
                    }
                });
            }
        }).subscribeOn(Schedulers.io())               // 切换到IO线程进行网络请求
                .observeOn(AndroidSchedulers.mainThread())  // 切换回到主线程 处理请求结果
                .subscribe(new Observer<Translation>() {
                    @Override
                    public void onSubscribe(Disposable d) {
                    }

                    @Override
                    public void onNext(Translation result) {
                        // 接收服务器返回的数据
                        Log.d(TAG,  "发送成功");
                        result.show();
                    }

                    @Override
                    public void onError(Throwable e) {
                        // 获取停止重试的信息
                        Log.d(TAG,  e.toString());
                    }

                    @Override
                    public void onComplete() {

                    }
                });

    }
}

7. Concat & Merge 组合操作符

组合/合并操作符
在这里插入图片描述

8. 创建操作符

创建操作符

  • 8.1 just
    快速创建1个被观察者对象(Observable)
    发送事件的特点:直接发送 传入的事件
    注:最多只能发送10个参数
  • 8.2 fromArray
    快速创建1个被观察者对象(Observable)
    发送事件的特点:直接发送 传入的数组数据
    注:会将数组中的数据转换为Observable对象
  • 8.3 fromIterable
    快速创建1个被观察者对象(Observable)
    发送事件的特点:直接发送 传入的集合List数据
    应用场景:
    快速创建 被观察者对象(Observable) & 发送10个以上事件(集合形式)
    集合元素遍历
  • 8.4 defer
    直到有观察者(Observer )订阅时,才动态创建被观察者对象(Observable) & 发送事件
    通过 Observable工厂方法创建被观察者对象(Observable)
    每次订阅后,都会得到一个刚创建的最新的Observable对象,这可以确保Observable对象里的数据是最新的
  • 8.5 timer
    快速创建1个被观察者对象(Observable)
    发送事件的特点:延迟指定时间后,发送1个数值0(Long类型)
    本质 = 延迟指定时间后,调用一次 onNext(0)
  • 8.6 interval
    快速创建1个被观察者对象(Observable)
    发送事件的特点:每隔指定时间 就发送 事件
// 参数说明:
        // 参数1 = 第1次延迟时间;
        // 参数2 = 间隔时间数字;
        // 参数3 = 时间单位;
        Observable.interval(3,1,TimeUnit.SECONDS)
                // 该例子发送的事件序列特点:延迟3s后发送事件,每隔1秒产生1个数字(从0开始递增1,无限个)
  • 8.7 intervalRange
    快速创建1个被观察者对象(Observable)
    发送事件的特点:每隔指定时间 就发送 事件,可指定发送的数据的数量
    a. 发送的事件序列 = 从0开始、无限递增1的的整数序列
    b. 作用类似于interval(),但可指定发送的数据的数量
// 参数说明:
        // 参数1 = 事件序列起始点;
        // 参数2 = 事件数量;
        // 参数3 = 第1次事件延迟发送时间;
        // 参数4 = 间隔时间数字;
        // 参数5 = 时间单位
        Observable.intervalRange(3,10,2, 1, TimeUnit.SECONDS)
                // 该例子发送的事件序列特点:
                // 1. 从3开始,一共发送10个事件;
                // 2. 第1次延迟2s发送,之后每隔2秒产生1个数字(从0开始递增1,无限个)
  • 8.8 range
    快速创建1个被观察者对象(Observable)
    发送事件的特点:连续发送 1个事件序列,可指定范围
    a. 发送的事件序列 = 从0开始、无限递增1的的整数序列
    b. 作用类似于intervalRange(),但区别在于:无延迟发送事件
  • 8.9 rangeLong
    作用:类似于range(),区别在于该方法支持数据类型 = Long
    具体使用与range()类似,此处不作过多描述
    在这里插入图片描述

9. subcribe与doOnNext,doOnError,doOnComplete区别

doOnNext、doOnError 和 doOnComplete 是用于在数据流中插入副作用的操作符,而 subscribe() 是用于实际接收和处理事件的订阅方法。它们在功能和用途上有一些重要的区别:

1. 主要区别

  1. 目的和用途:

    • subscribe():用于启动数据流并处理发射的每一个数据项、错误和完成事件。它是实际的订阅方法,定义了如何响应这些事件。
    • doOnNext():用于在每个数据项发射时插入副作用,例如日志记录或调试。它不会影响数据流的行为,也不会处理数据项。
    • doOnError():用于在发生错误时插入副作用,例如记录错误信息。它不会终止数据流,只是提供一个在错误发生时执行的钩子。
    • doOnComplete():用于在 Observable 完成时插入副作用,例如执行一些清理工作。它不会处理完成事件,只是提供一个在完成时执行的钩子。
  2. 触发情况:

    • subscribe():触发时机是当你调用 subscribe() 方法时,数据流开始运行。
    • doOnNext():每当 Observable 发射新的数据项时触发。
    • doOnError():在 Observable 发射错误时触发。
    • doOnComplete():在 Observable 完成时触发。
  3. 返回值:

    • 所有的 doOn* 方法返回的是一个新的 Observable,你可以继续对其进行链式操作。而 subscribe() 不返回任何值,它是一个终止操作。

2. 示例代码

下面是一个示例,展示了如何使用这些方法并说明它们的区别:

import io.reactivex.rxjava3.core.Observable;

public class Example {
    public static void main(String[] args) {
        Observable<String> observable = Observable.create(emitter -> {
            try {
                emitter.onNext("Hello");
                emitter.onNext("World");
                // 模拟一个错误
                if (true) {
                    throw new RuntimeException("发生错误!");
                }
                emitter.onComplete();
            } catch (Exception e) {
                emitter.onError(e);
            }
        });

        observable
            .doOnNext(item -> System.out.println("发射: " + item)) // 在发射每个项时触发
            .doOnError(throwable -> System.out.println("捕获到错误: " + throwable.getMessage())) // 发生错误时触发
            .doOnComplete(() -> System.out.println("完成时触发")) // 完成时触发
            .subscribe(
                item -> System.out.println("收到: " + item), // 处理成功发射的每个项
                throwable -> System.out.println("最终错误处理: " + throwable.getMessage()), // 最终处理错误
                () -> System.out.println("最终完成处理") // 处理完成
            );
    }
}

3. 总结

  • 使用 subscribe() 来处理实际的事件响应(成功项、错误和完成)。
  • 使用 doOnNext()、doOnError() 和 doOnComplete() 插入副作用逻辑,而不影响数据流的主逻辑。
  • 这些 doOn* 方法一般用于调试、日志记录或其他附加操作,而不会改变数据的流动或处理过程。

通过将这两种方法结合使用,可以实现清晰且高效的代码结构,既能处理数据流,也能监控副作用。

Android中的响应式编程:RxJava实战 在传统的编程模式中,我们通常通过编写一系列的指令来实现特定的功能。然而,随着移动应用变得越来越复杂,传统的编程模式可能会导致代码臃肿、难以维护和不易扩展。响应式编程是一种新的编程范式,它通过使用观察者模式和函数式编程来处理异步操作和事件流。在响应式编程中,我们可以定义数据流和操作序列,让程序更加简洁和易于理解。RxJava是一个流行的响应式编程库,它是ReactiveX在Java虚拟机上的实现。RxJava为我们提供了丰富的操作符和工具,用于处理数据流和异步操作。 阅读详情

相关推荐

Dify实战:智能邮件工作流配置全解析

本文详细解析了如何利用Dify平台配置智能邮件工作流,实现邮件处理的自动化与智能化。内容涵盖从获取邮箱授权、安装插件、安全配置环境变量,到构建邮件发送工作流、创建调用该工作流的智能体(Agent)的完整步骤,并分享了连接知识库实现智能客服、定时发送日报等进阶自动化场景,旨在帮助用户显著提升邮件处理效率。

t8u9v0w1x的博客 795

android--RXJava详细使用篇

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

袁震的博客 4556

告别单一帧:在CFD-POST中完整加载Fluent瞬态计算结果的实战指南

本文详细介绍了在CFD-POST中完整加载Fluent瞬态计算结果的实战指南,解决工程师常见的只能看到最后一帧数据的问题。通过Fluent端的正确设置和CFD-POST端的完整加载技巧,帮助用户高效处理瞬态数据,提升后处理效率。文章还提供了常见问题排查、性能优化和高级后处理技巧,适用于Workbench环境下的流体流动分析。

weixin_29284657的博客 540

给 Android 开发者的 RxJava 详解

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

青岛海珊瑚IT学习中心 3377

5个IO口驱动188数码管:查理复用算法在TM52F1363上的极致应用

本文深入解析了如何利用查理复用算法,在TM52F1363单片机上仅用5个IO口驱动188数码管。通过精密的硬件连接与软件时序控制,结合高阻态和动态扫描策略,实现了在极致资源限制下的稳定显示,为成本敏感型嵌入式产品提供了高效的IO复用解决方案。

numpy6sculptor的博客 478

一步步指导:在Chrome中安装Vue插件vue-devtools

Vue.js是现代Web开发中最流行的前端框架之一,它以其轻量级、高性能和易于理解的设计理念受到开发者的喜爱。为了更高效地开发和调试Vue应用,Vue.js官方提供了一个强大的开发工具——vue-devtools。

小透明的博客 5619

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

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

wy313622821的博客 3542

基于PyTorch的BP神经网络PID控制器动态调参实战

本文详细介绍了基于PyTorch的BP神经网络PID控制器动态调参实战,结合BP神经网络的自适应能力和PID控制算法的经典优势,实现工业控制中的高效参数调整。通过PyTorch实现BP-PID融合架构,包括网络设计、损失函数优化及动态调参技巧,显著提升控制性能,适用于温度控制、电机控制等场景。

weixin_29094775的博客 522

android开发人员必备知识 RxJava/RxJava学习指南

你如果压根不了解, 或者用的很多了想查询具体字的区别请移步这篇文章 ----> RxJava 与 RxAndroid 入门篇

天涯海风的博客 190

HTB_Bike靶机之模板注入

船到桥头自然直 文章目录信息收集模板引擎SSIT 模板注入后放答案 信息收集 日常 A 扫描,两个端口 22/tcp open ssh OpenSSH 8.2p1 Ubuntu 4ubuntu0.4 (Ubuntu Linux; protocol 2.0) | ssh-hostkey: | 3072 48:ad:d5:b8:3a:9f:bc:be:f7:e8:20:1e:f6:bf:de:ae (RSA) | 256 b7:89:6c:0b:20:ed:49:b2:c1:86:7c:.

网络安全学习 798

GTSAM | gtsam::ISAM2

本节简单介绍`gtsam::ISAM2`类。

九七的博客 734

Android:这是一份全面 & 详细的RxJava学习攻略

前言 Rxjava由于其基于事件流的链式调用、逻辑简洁 & 使用简单的特点,深受各大 Android开发者的欢迎。 RxJava如此受欢迎的原因,在于其提供了丰富 & 功能强大的操作符,几乎能完成所有的功能需求 今天,Carson将为大家带来 一份全面、易懂、清晰的Rxjava学习指南,涵盖 入门详解、原理、操作符使用、实际开发应用案例等 Carson带你学RxJava系列文章,包括 原理、操作符、应用场景、背压等等,请关注专题:Carson带你学:RxJava 目录 入门..

Carson带你学Android 8589

SAP BTP Trial 生命周期全解析:90 天试用、30 天活跃规则、Kyma 有效期与向 Free Tier 的顺滑迁移

摘要: SAP BTP免费试用账号(trial)提供90天有效期,需每30天登录一次保持活跃状态。Kyma运行时有效期仅14天,需特别注意重建。到期后数据不可恢复,建议将关键配置脚本化并保存。若需长期使用,可迁移至无时间限制的免费层(free tier)。文章详细拆解了试用生命周期规则,包括续期、删除机制,并针对CAP开发、集成套件和Kyma等场景提供实操建议,帮助用户规避常见误区,高效利用试用资源。(150字)

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 368

Android RxJava:这是一份RxJava使用入门学习指南

即 开厨房 - 确定对应菜式Next事件、Complete事件 &Error事件。具体如下:具体实现// 1. 创建观察者 (Observer )对象// 2. 创建对象时通过对应复写对应事件方法 从而 响应对应事件// 观察者接收事件前,默认最先调用复写 onSubscribe()@OverrideLog.d(TAG, “开始采用subscribe连接”);

2401_84009192的博客 1457

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

efm32 入门.pdf

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

android rxjava https,RxJava资源合集-学习RxJava,看这里就够了

什么是RxJava?RxJava是响应式程序设计的一种实现。在响应式程序设计中,当数据到达的时候,消费者做出响应。响应式编程可以将事件传递给注册了的observer。我们知道RxJava是对于Android项目来说是一个重要的library,所以我们必须好好掌握。而且我认为:对于那些能掌握它的人来说,RxJava就是一件艺术品,可以带来无限可能。让我们来掰一掰那些正确学习RxJava的最佳资源。G...

weixin_32081953的博客 171

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Android RxJava的学习总结

主要结合https://www.imooc.com/article/68834这篇来学习的,先提一下观察者模式的一个别名,就是:发布-订阅模式。 在RxJava中有3种角色: * Observable (被观察者) * Observer /Subscriber (观察者/订阅者) * Event (事件) 被观察者 Obs...

Crystal_xing的专栏 294

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

2024年安卓最新详细的 RxJava 学习攻略 & 指南(4),面试高频题目

PS:之前因为秋招收集的二十套一二线互联网公司Android面试真题 (含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。这里,笔者分享一份从架构哲学的层面来剖析的视频及资料分享给大家梳理了多年的架构经验,筹备近6个月最新录制的,相信这份视频能给你带来不一样的启发、收获。真正最能锻炼能力的便是直接去阅读源码,不仅限于阅读各大系统源码,还包括各种优秀的开源库。

2301_79098336的博客 473

【Android RxJava】RxJava学习记录1

RxJava学习记录

studyForMokey的博客 1256

每天学习一个Android中的常用框架——15.RxJava

RxJava的集成和快速使用

赈川 529

2024年安卓最全RxJava零基础入门(三)(1),2024年最新Android系列学习进阶视频

针对Android程序员,我这边给大家整理了一些资料,包括不限于高级UI、性能优化、架构师课程、NDK、混合式开发(ReactNative+Weex)微信小程序、Flutter等全方面的Android进阶实践技术;希望能帮助到大家,也节省大家在网上搜索资料的时间来学习,也可以分享动态给身边好友一起学习!Android前沿技术大纲全套体系化高级架构视频Android高级架构资料、源码、笔记、视频。

2401_84545339的博客 453

Rxjava,学习android

doOnNext() 当需要插入一个方法,但是不对Observe产生影响的时候,可以用doOnNext,(map的返回值是会影响下层的)。 Rxjava的设计模式 标准观察者设计模式 微信公众号就是典型的观察者设计模式。公众号=被观察者,用户=观察者,关注公众号=订阅。所以公众号一推送消息,所有观察者都能收到消息。 观察者设计模式就是:多个观察者去订阅一个被观察者,当被观察者发生改变的时候,所有观察者都能收到通知。 具体实现: 被观察者抽象(公众号) 被观察者实现(公众号) 观察者抽象(用户)

m0_66264655的博客 672

RXjava解析(二)我把RXjava的源码和这份面试都给你了,Android程序员架构之路该如何继续学习

RxJava 在RxJava中,一个实现了Observer接口的对象可以订阅(subscribe)一个Observable 类的实例。订阅者(subscriber)对Observable发射(emit)的任何数据或数据序列作出响应。这种模式简化了并发操作,因为它不需要阻塞等待Observable发射数据,而是创建了一个处于待命状态的观察者哨兵,哨兵在未来某个时刻响应Observable的通知。 ####Single 介绍 RxJava(以及它派生出来的RxGroovy和RxScala)中有一个名为Sing.

m0_66264699的博客 173

android 学习之rxjava

最近在做的一个项目,所用到的技术和rxjava有关,因此还特地的学习了下,在这简单的介绍下rxjava: RxJava是什么 RxJava 在 GitHub 主页上的自我介绍是 "a library for composing asynchronous and event-based programs using observable sequences for the Java V...

a14780429533的博客 198

RxJava在Android中学习记录之一

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

dzy_mails的专栏 185

Android RxJava 个人学习总结

个人对Android 中的RxJava一直不是很理解,边学习边记载,如有问题,欢迎雅正. 一直搞Android Framework工程师,只有刚参加工作的时候做了一段独立三方app开发,之前工作更多的内容更多的是解决Android framework的问题,现在客串一下Android app工程师,RxJava现在很火,那就学习总结下。 在这个框架满天...

dzy_mails的专栏 274
上一篇: 【Android零碎笔记】
下一篇: 【Android书籍】读书笔记
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值