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对象的实现了。所以虽然这个例子简单但其实蕴含了许多隐藏的的高阶细节,等同于很多现代高级语言的语法糖。
学习的任务就是把隐藏的原理搞清楚,避免踩坑。