RxJava简单理解

简单介绍

RxJava是基于 JVM的对ReactiveX(又称响应式编程)的一种实现。因为是基于JVM的,所以不仅是java语言环境可以使用RxJava,所有基于JVM的语言(比如:Kotlin,Scala,Groovy等)也可以使用RxJava.

RxJava的特点:异步 流式(链式)调用

核心思想(流水线)

起点----终点
就像工厂车间流水线一样,一个起点(Observable),一个终点(Observer),在起点和终点之间可以进行各种加工操作(操作符),下线的人只关心相邻上线提供的半成品,而不关心其它工位提供的半成品是什么。

引入

compile ‘io.reactivex.rxjava3:rxjava:3.0.4’
查看最新版本

简单使用

使用的时候只需要关心两个角色,一个被观察者(Observable),一个观察者(Observer)。

Observable创建操作符

Observable的创建,库提供了很多方法和操作符,这里只介绍几个常用的,大家参考文档举一反三。

create

最基本,但不常用,使用提供的操作符基本能满足需求

 val observable = Observable.create(object : ObservableOnSubscribe<String> {
            override fun subscribe(emitter: ObservableEmitter<String>) {
                emitter.onNext("ayy")
                emitter.onComplete()
            }
        })
interval

周期执行,如下:每隔1秒执行一次,无限循环,不会终止。

Observable.interval(1, TimeUnit.SECONDS)
            .subscribe {
                Log.e(TAG, "间隔执行:$it ")
            }
intervalRange

与interval相比,周期执行有限的次数。这种可以应用到获取验证码的倒计时场景中。

//倒计时,比如发送短信验证码倒计时 0-59
        Observable.intervalRange(0, 61, 0, 1, TimeUnit.SECONDS)
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(
                { Log.e(TAG, "accept: 倒计时${60 - it}") },
                { Log.e(TAG, "accept: onError") },
                { Log.e(TAG, "run: 完成,再次发送验证码") })
timer

计时器,多少秒后执行

		//计时器,5秒后执行
        Observable.timer(5, TimeUnit.SECONDS).subscribe {
            Log.e(TAG, "click: $it")
        }
Observer

        val observer = object :Observer<String>{
            override fun onComplete() {
                Log.e(TAG, "onComplete: 完成时调用" )
            }

            override fun onSubscribe(d: Disposable?) {
                Log.e(TAG, "onSubscribe: 订阅时调用" )
            }

            override fun onNext(t: String?) {
                Log.e(TAG, "onNext: " )
            }

            override fun onError(e: Throwable?) {
                Log.e(TAG, "onError: onError后,后续的事件不会再发出" )
            }
        }

当然还有更简单的,使用Consumer,结合Java8或者kotlin的lambda代码更简洁:
1.只关心onNext方法

Observable.just("")
            .subscribe(object : Consumer<String> {
                override fun accept(t: String?) {
                    Log.e(TAG, "accept: 相当于onNext" )
                }
            })

使用lambda简化:

Observable.just("")
           .subscribe { Log.e(TAG, "accept: 相当于onNext" ) }

2.只关心onNext和onError方法

Observable.just("")
           .subscribe(object :Consumer<String>{
               override fun accept(t: String?) {
                   Log.e(TAG, "accept: 相当于onNext" )
               }

           },object :Consumer<Throwable>{
               override fun accept(t: Throwable?) {
                   Log.e(TAG, "accept: 相当于onError" )
               }

           })

使用lambda简化后:

Observable.just("")
           .subscribe(
               { Log.e(TAG, "accept: 相当于onNext") },
               { Log.e(TAG, "accept: 相当于onError") })

3.onNext,onError,onComplete都关心

Observable.just("")
           .subscribe(object :Consumer<String>{
               override fun accept(t: String?) {
                   Log.e(TAG, "accept: 相当于onNext" )
               }

           },object :Consumer<Throwable>{
               override fun accept(t: Throwable?) {
                   Log.e(TAG, "accept: 相当于onError" )
               }

           },object :Action{
               override fun run() {
                   Log.e(TAG, "run: 相当于onComplete方法" )
               }

           })

简化后:

Observable.just("")
           .subscribe(
               { Log.e(TAG, "accept: 相当于onNext") },
               { Log.e(TAG, "accept: 相当于onError") },
               { Log.e(TAG, "run: 相当于onComplete方法") })

线程调度

线程调度不好用文字表达清楚,记住结论即可:
subscribeOn决定上面的代码所在线程;
observeOn决定下面代码所在线程。
在这里插入图片描述
其中io线程的调度内部使用了线程池,main线程的调度使用了handler来将代码切换到主线程中执行。

网络嵌套(串行)

场景:一键登录,以手机号为参数,先请求接口拿到认证token,再以token为参数请求用户信息。使用flatMap操作符。

        HttpUtil.api.getToken("手机号")
            .subscribeOn(Schedulers.io())
            .flatMap { token ->
                HttpUtil.api.getUserInfo(token)
            }.observeOn(AndroidSchedulers.mainThread())
            .subscribe({
                Log.e(TAG, "click: 请求到用户信息")
            }, {
                it.printStackTrace()
                Log.e(TAG, "click: 异常:${it.message}")
            })

场景:先操作本地数据库查询缓存数据,再请求网络更新UI,数据库操作在非UI线程中执行

        Observable.create<List<User>> {
            //模拟查询数据库
            Thread.sleep(1000)
            val data = mutableListOf<User>()
            for (i in 0..10) {
                data.add(User())
            }
            it.onNext(data)
//            it.onComplete()
        }.subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .flatMap {
                //更新UI,展示缓存数据
                Log.e(TAG, "click: $it")
                HttpUtil.api.getUserList()
            }.subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe {
                //更新UI,替换缓存数据,展示网络数据
                Log.e(TAG, "click: ${it.data}")
            }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当然可以!以下是一个简单RxJava 示例: ```java import io.reactivex.rxjava3.core.Observable; import io.reactivex.rxjava3.core.Observer; import io.reactivex.rxjava3.disposables.Disposable; public class RxJavaDemo { public static void main(String[] args) { Observable<String> observable = Observable.just("Hello, World!"); Observer<String> observer = new Observer<String>() { @Override public void onSubscribe(Disposable d) { // 在订阅时被调用 System.out.println("onSubscribe"); } @Override public void onNext(String s) { // 当收到数据时被调用 System.out.println("onNext: " + s); } @Override public void onError(Throwable e) { // 当发生错误时被调用 System.out.println("onError: " + e.getMessage()); } @Override public void onComplete() { // 当完成时被调用 System.out.println("onComplete"); } }; observable.subscribe(observer); } } ``` 这个示例中,我们创建了一个简单的 Observable 对象,它只发射了一个字符串 "Hello, World!"。然后我们创建了一个 Observer 对象,它定义了在收到数据、发生错误或完成时的行为。最后,我们通过调用 `observable.subscribe(observer)` 来订阅 Observable。 运行这个示例,你将会看到以下输出: ``` onSubscribe onNext: Hello, World! onComplete ``` 这表明在订阅时,`onSubscribe` 被调用;然后收到了数据 "Hello, World!",`onNext` 被调用;最后,`onComplete` 被调用,表示完成了数据的发射过程。 请注意,这只是 RxJava 的一个简单示例,RxJava 还有很多更强大的操作符和功能可以使用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值