RxJava2 学习笔记(一)从官方例子的的一个疑问开始

本笔记主要依据Google官方例子:https://github.com/googlesamples/android-architecture-components/tree/master/BasicRxJavaSample

参考国人教程:https://www.jianshu.com/p/464fa025229e

这篇笔记从一个疑问开始,参考BasicRxJavaSample源代码的UserActivity中的代码片段:

        mDisposable.add(mViewModel.getUserName()
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(userName -> mUserName.setText(userName),
                        throwable -> Log.e(TAG, "Unable to update username", throwable)));
                        
        mDisposable.add(mViewModel.updateUserName(userName)
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(() -> mUpdateButton.setEnabled(true),
                        throwable -> Log.e(TAG, "Unable to update username", throwable)));

链式调用,流这些概念都比较容易理解,但实际用到项目上总有些细节不搞清楚会很麻烦。例如上述两个subscribe的行为,分别对应着 获取用户名 getUserName更新用户名 updateUserName的订阅。

神奇的事情发生了,每次updateUserName的事件流完成后,都会自动执行到getUserName从而更新UI。从例子给出的代码中没有任何一处代码显式地说明为何能自动地实现

可以观察到 getUserName 和 updateUserName 的 lamda表达式参数不同。实际上这涉及到 getUserName 和 updateUserName 返回的observable对象不同,getUserName 返回的是持续产生事件的的 ++Flowable++,而 updateUserName 返回的是终结式的 ++Completable++。

更详细关于observable的区别文章可以参考:https://www.jianshu.com/p/0955dd8b2388

而为何需要这样设计或者为何可以这样实现,就涉及到Room如何将数据库转换成Dao对象的实现了。所以虽然这个例子简单但其实蕴含了许多隐藏的的高阶细节,等同于很多现代高级语言的语法糖。

学习的任务就是把隐藏的原理搞清楚,避免踩坑。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 174,554评论 25 709
  • # Python 资源大全中文版 我想很多程序员应该记得 GitHub 上有一个 Awesome - XXX 系列...
    aimaile阅读 26,645评论 6 427
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,259评论 19 139
  • 前言 如果你对RxJava1.x还不是了解,可以参考下面文章。 1. RxJava使用介绍 【视频教程】2. Rx...
    jdsjlzx阅读 21,282评论 3 78
  • 2017.12.10 星期日 晴有暖阳 距离我放假回家大概,大概不到20天吧。 朋友说我不是恋家的人,除了寒暑假回...
    莎莎莎大212阅读 308评论 3 4