RxJava浅析

RxJava 优点

改变思维,思路整洁,提升效率
(1)改变我们的编程思维方式,让我们的编写的代码更加高效
(2)能够梳理代码流程,更加清晰整洁

RXjava是一个响应式的编程,运用RxJava本身不会提升代码执行效率,它不针对也不解决任何问题,而是从编程思想层面来改变我们的编程思维,能够梳理代码流程,更加清晰整洁,从而让我们编写的代码更加高效,更易维护。

备注:响应式编程是一种通过异步和数据流来构建事务关系的编程模型。例如:APP初始化逻辑,完成SDK初始化,数据库初始化,登陆,之后跳转主界面。

RxJava在github上官方解释

RxJava is a Java VM implementation of Reactive Extensions: a library for composing asynchronous and event-based programs by using observable sequences.

It extends the observer pattern to support sequences of data/events and adds operators that allow you to compose sequences together declaratively while abstracting away concerns about things like low-level threading, synchronization, thread-safety and concurrent data structures.

翻译过来是:
RxJava是一个响应扩展的Java VM实现:一个通过使用可观察序列来组合异步和基于事件的程序的库。

它扩展了观察者模式以支持数据/事件序列,并添加了操作符,允许您以声明的方式将序列组合在一起,同时抽象出对底层线程、同步、线程安全和并发数据结构等问题的关注。

接入:

implementation "io.reactivex.rxjava2:rxjava:2.0.6"
implementation 'io.reactivex.rxjava2:rxandroid:2.1.0'

示例代码

//Observable : 被观察者(起点)
//Observer: 观察者(终点)
        
        //被观察者(起点) 
        Observable
                //执行顺序的第二步
                .just(IMG_PATH) //IMG_PATH 事件源
                //执行顺序的第三步
                .map(new Function<String, Bitmap>() {
                    @Override
                    public Bitmap apply(@NonNull String s) throws Exception {
                        //耗时操作 不用加try-catch因为该方法已捕获异常
                        //通过路径 s 异步加载 bitmap
                        Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher);
                        return bitmap;
                    }
                })
                .map(new Function<Bitmap, Bitmap>() {
                    @Override
                    public Bitmap apply(@NonNull Bitmap bitmap) throws Exception {
                        //可以进行加水印等后续操作
                        return bitmap;
                    }
                })

                //给上游分配异步线程(订阅线程)
                .subscribeOn(Schedulers.io())

                //给下游分配安卓主线程(观察者Observer执行的线程)
                .observeOn(AndroidSchedulers.mainThread())

                //订阅 关联 起点(被观察者Observable)和(观察者Observer)终点
                .subscribe(new Observer<Bitmap>() {
                    @Override
                    public void onSubscribe(@NonNull Disposable d) {
                        //执行顺序的第一步
                        //弹出加载提示框
                    }

                    @Override
                    public void onNext(@NonNull Bitmap bitmap) {
                        //执行顺序的第四步
                        image.setImageBitmap(bitmap);
                    }

                    @Override
                    public void onError(@NonNull Throwable e) {
                        //执行顺序的第五步(onError 和onComplete 互斥)
                        //关闭加载提示框
                    }

                    @Override
                    public void onComplete() {
                        //执行顺序的第五步 (onError 和onComplete 互斥)
                        //关闭加载提示框
                    }
                });
        
        //自定义方式
        Observable.create(new ObservableOnSubscribe<String>() {
            @Override
            public void subscribe(@NonNull ObservableEmitter<String> emitter) throws Exception {
                emitter.onNext("1");
                emitter.onNext("2");
                emitter.onNext("3");
            }
        });

代码图解:

在这里插入图片描述

RxJava是倒“U”形的执行顺序

RxJava中观察者模式和标准的观察者模式区别:

标准的观察者模式:
一个被观察者,可以注册多个观察者,需要自己主动发出事件。

RxJava使用了变种的观察者:
多个被观察者,只能注册一个观察者,一旦注册会马上分发事件。
RxJava观察者备注:1 被观察者显示的是一个,其实源码里是多个;
2 注册在这里叫订阅;
3 subscribe()调这个方法后会直接回调onSubscribe()方法。

感谢:腾讯课堂

ThreadLocal 是 Java 中的一个类,它提供了一种线程局部变量的机制。线程局部变量是指每个线程都有自己的变量副本,每个线程对该变量的访问都是独立的,互不影响。 ThreadLocal 主要用于解决多线程并发访问共享变量时的线程安全问题。在多线程环境下,如果多个线程共同访问同一个变量,可能会出现竞争条件,导致数据不一致或者出现线程安全问题。通过使用 ThreadLocal,可以为每个线程提供独立的副本,从而避免了线程安全问题。 ThreadLocal 的工作原理是,每个 Thread 对象内部都维护了一个 ThreadLocalMap 对象,ThreadLocalMap 是一个 key-value 结构,其中 key 是 ThreadLocal 对象,value 是该线程对应的变量副本。当访问 ThreadLocal 的 get() 方法时,会根据当前线程获取到对应的 ThreadLocalMap 对象,并从中查找到与 ThreadLocal 对象对应的值。如果当前线程尚未设置该 ThreadLocal 对象的值,则会通过 initialValue() 方法初始化一个值,并将其存入 ThreadLocalMap 中。当访问 ThreadLocal 的 set() 方法时,会将指定的值存入当前线程对应的 ThreadLocalMap 中。 需要注意的是,ThreadLocal 并不能解决共享资源的并发访问问题,它只是提供了一种线程内部的隔离机制。在使用 ThreadLocal 时,需要注意合理地使用,避免出现内存泄漏或者数据不一致的情况。另外,由于 ThreadLocal 使用了线程的 ThreadLocalMap,因此在使用完 ThreadLocal 后,需要手动调用 remove() 方法清理对应的变量副本,以防止内存泄漏。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值