资讯动态

RxBinding 版本演进全解析:从 0.1.0 到 4.0.0 的架构变迁、API 升级与迁移指南

发布时间:2026/10/14 3:12:01 来源:尧图企业网站定制
移动开发【免费下载链接】RxBindingRxJava binding APIs for Androids UI widgets.项目地址https://gitcode.com/gh_mirrors/rx/RxBinding点击查看免费下载本篇文章以仓库根目录 CHANGELOG.md 为骨架系统梳理 RxBinding 从 2015 年首个版本到 4.0.0 的完整演进脉络包括 RxJava 1/2/3 三代适配、AndroidX 迁移、Kotlin-first 重构、Maven 坐标与包名变更、绑定 API 的增减与废弃清理并结合仓库源码如InitialValueObservable、各 Observable 实现与测试用例逐一印证关键设计决策。读完本文你将掌握 RxBinding 各版本的差异、绑定 API 的底层实现模式以及从旧版本向com.jakewharton.rxbinding4迁移的完整清单。一、CHANGELOG 纵览一条主线与三次大版本跃迁RxBinding 的变更日志记录了从0.1.02015-08-02到4.0.02020-05-19共 15 个正式版本的演进。纵观整份 CHANGELOG演进主线非常清晰大版本首个正式版本对应的 RxJava 世代坐标/包名前缀关键主题0.x0.1.0 (2015-08-02)RxJava 1com.jakewharton.rxbinding模块版图成型、CheckResult/NonNull注解、Kotlin 模块起步1.x1.0.0 (2016-12-01)RxJava 1com.jakewharton.rxbindingAPI 稳定Toolbar/ViewPager/NestedScrollView 等大量新绑定2.x2.0.0 (2017-03-06)RxJava 2com.jakewharton.rxbinding2InitialValueObservable、事件类型重构、Void→Object3.x3.0.0 (2019-07-23)RxJava 2com.jakewharton.rxbinding3AndroidX-only、Kotlin-first、事件类改为 Kotlindata class4.x4.0.0 (2020-05-19)RxJava 3com.jakewharton.rxbinding4仅升级 RxJava 3无功能变化三个关键版本节点分别是2.0.0全面转向 RxJava 2、3.0.0AndroidX 与 Kotlin-first 重构、4.0.0RxJava 3 支持。仓库根目录 gradle.properties 显示当前开发版本为4.0.1-SNAPSHOTGROUP为com.jakewharton.rxbinding4与 4.0.0 的坐标体系一致。二、4.0.0全面切换 RxJava 3Version 4.0.0 (2020-05-19)This version updates to support RxJava 3. No functional changes. The groupId and package name are nowcom.jakewharton.rxbinding4.4.0.0 是一次纯粹的平台升级API 表面没有任何功能变化只把底层从 RxJava 2 换成 RxJava 3同时将 Maven groupId 与 Kotlin 包名统一为com.jakewharton.rxbinding4。这意味着 3.x 用户升级到 4.x 时改动点集中在坐标与 import 语句。当前仓库中的全部源码都已落在com.jakewharton.rxbinding4包下例如 rxbinding/src/main/java/com/jakewharton/rxbinding4/InitialValueObservable.kt 顶部即为package com.jakewharton.rxbinding4并直接 importio.reactivex.rxjava3.core.Observable与io.reactivex.rxjava3.core.Observer这是 RxJava 3 的典型引用形态。2.1 4.x 的模块划分与 Maven 坐标根据 README.md 的 Download 章节4.x 按平台/AndroidX/Material 三组提供依赖坐标Platform bindingsimplementation com.jakewharton.rxbinding4:rxbinding:4.0.0AndroidX library bindingsimplementation com.jakewharton.rxbinding4:rxbinding-core:4.0.0 implementation com.jakewharton.rxbinding4:rxbinding-appcompat:4.0.0 implementation com.jakewharton.rxbinding4:rxbinding-drawerlayout:4.0.0 implementation com.jakewharton.rxbinding4:rxbinding-leanback:4.0.0 implementation com.jakewharton.rxbinding4:rxbinding-recyclerview:4.0.0 implementation com.jakewharton.rxbinding4:rxbinding-slidingpanelayout:4.0.0 implementation com.jakewharton.rxbinding4:rxbinding-swiperefreshlayout:4.0.0 implementation com.jakewharton.rxbinding4:rxbinding-viewpager:4.0.0 implementation com.jakewharton.rxbinding4:rxbinding-viewpager2:4.0.0Google material library bindingsimplementation com.jakewharton.rxbinding4:rxbinding-material:4.0.0这些模块与 settings.gradle 中include的 11 个 Gradle 子项目一一对应rxbinding、rxbinding-appcompat、rxbinding-core、rxbinding-drawerlayout、rxbinding-leanback、rxbinding-material、rxbinding-recyclerview、rxbinding-slidingpanelayout、rxbinding-swiperefreshlayout、rxbinding-viewpager、rxbinding-viewpager2另有仅供测试使用的testing-utils模块。2.2 RxJava 3 在源码层的体现以rxbinding-viewpager2模块为例三处绑定实现均直接依赖 RxJava 3 类型PageSelectedObservable.kt ——ViewPager2.pageSelections()返回InitialValueObservableIntPageScrolledObservable.kt ——ViewPager2.pageScrollEvents()返回ObservablePageScrollEvent其中PageScrollEvent是包含viewPager2、position、positionOffset、positionOffsetPixels的 Kotlindata classPageScrollStateChangedObservable.kt ——ViewPager2.pageScrollStateChanges()返回ObservableInt。对应测试 RxViewPager2Test.kt 通过subscribeOn(AndroidSchedulers.mainThread())配合RecordingObserver验证了拖拽时按SCROLL_STATE_DRAGGING → SCROLL_STATE_SETTLING → SCROLL_STATE_IDLE的完整状态序列以及dispose()之后不再产生任何事件的行为。三、3.xAndroidX 迁移与 Kotlin-first 重构3.x 是 RxBinding 历史上变动最剧烈的一个大版本CHANGELOG 在 3.0.0 与 3.0.0-alpha1 两条目中对核心变化做了完全一致的描述。3.1 3.0.02019-07-23的六项重大变更新 Maven 坐标com.jakewharton.rxbinding3:rxbindingetc.包名改为com.jakewharton.rxbinding3.*。AndroidX-only整个库只支持 AndroidX。需要继续使用旧 Support Library 的项目必须停留在2.2.0。Kotlin-first-kotlin后缀的独立 artifact 全部取消。Java 调用方拿到与之前相同的 APIKotlin 调用方获得基于扩展函数的 API。事件类从 AutoValue 改为 Kotlindata class。函数类型替换RxJava 的Predicate与 Java 的Callable不再使用替换为 Kotlin 函数类型。Java 调用方仍可使用Function1但官方鼓励直接使用 lambda。Unit取代Object不带任何信息的纯通知型 Observable 统一发射Unit对 Kotlin 扩展用户而言这一点从早期就是如此。清理所有废弃方法被移除一些琐碎的 consumer 工厂被移除官方给出的替代方案是直接向流订阅 lambda 来复刻其功能。此外3.0.0 还修复了与 Material Design Componentsv1.1.0的二进制兼容性问题3.0.0-alpha2 则修复了 AdapterView 回调中被点击 View 的可空性标注。3.2 3.1.02019-11-22新增rxbinding-viewpager23.1.0 唯一的新增是全新模块rxbinding-viewpager2为ViewPager2提供三个绑定pageSelections—— 页面选中事件发射页码索引pageScrollEvents—— 页面滚动事件含PageScrollEvent的偏移信息pageScrollStateChanges—— 页面滚动状态变化拖拽/稳定/归位。这些正是当前仓库rxbinding-viewpager2模块下三个源码文件所实现的能力且pageSelections继承自InitialValueObservable会在订阅时立刻发射viewPager2.currentItem作为初始值见 PageSelectedObservable.kt 的initialValue实现与测试 RxViewPager2Test.kt 中assertEquals(0, recorder.takeNext())的断言。四、2.xRxJava 2 时代的模块化与 API 收敛4.1 2.0.02017-03-06只支持 RxJava 22.0.0 宣布only supports RxJava 2并带来三项影响深远的 API 设计1InitialValueObservableT与skipInitialValue()Bindings which emit an initial value now return anInitialValueObservableTwhich offers a type-safe way to skip that value viaskipInitialValue().源码实现位于 rxbinding/src/main/java/com/jakewharton/rxbinding4/InitialValueObservable.kt它是一个继承自 RxJavaObservableT的抽象类要求子类提供initialValue在subscribeActual中先订阅监听器、再立刻发射初始值abstract class InitialValueObservableT : ObservableT() { protected abstract val initialValue: T override fun subscribeActual(observer: Observerin T) { subscribeListener(observer) observer.onNext(initialValue) } protected abstract fun subscribeListener(observer: Observerin T) fun skipInitialValue(): ObservableT Skipped() private inner class Skipped : ObservableT() { override fun subscribeActual(observer: Observerin T) { subscribeListener(observer) } } }从源码结构可以清晰地看出skipInitialValue()的实现机制它返回一个只订阅监听器、不发射初始值的Skipped内部类因此语义上等价于过滤掉首个值但比在流上加skip(1)更类型安全、意图更明确。这一设计在后续 3.x、4.x 中被完整保留。2事件类型从枚举改为抽象类 子类Event objects which previously contained an enum now use an abstract event type and subclasses for easier filtering using theofType(Class)operator.在此之前事件对象内部用一个 enum 区分事件种类2.0.0 改为抽象事件基类 具体子类从而可以直接用 RxJava 的ofType(Class)操作符做类型过滤例如只关心onPageSelected而不关心其他回调。3Void改为ObjectBindings which previously emitted null using theVoidtype now useObjectand omit an opaque item instance for which no guarantees are provided.此前用Void类型、实际发射null的绑定现在统一发射一个不透明的Object实例。CHANGELOG 明确警告不要依赖这个实例是否相同、相等或不同——它只是一个通知信号。结合当前源码可见纯通知型绑定如 ViewClickObservable.kt 的View.clicks()在 Kotlin-first 的 3.x/4.x 中进一步演化为发射Unit。4.2 2.1.x细节修复与 consumer 废弃2.1.02018-01-30新增rxbinding-design的FloatingActionButton.visibility显示/隐藏 FABSnackbar dismisses 改用 add/remove 回调方式开始废弃直接委托给某个方法的简单 consumer官方示例是RxView.enabled(view)应改为方法引用view::setEnabled同时把RequiresApi注解传播到 Kotlin 扩展上。2.1.12018-02-12为 consumer 补充 ProGuard 规则以避免 AutoValue 注解告警移除无用的BuildConfig类移除 Kotlin 扩展中的 Java 互操作检查这些检查本就存在于其委托的 Java 代码中。4.3 2.2.02018-09-25Java 8 字节码与两个新绑定新增rxbinding-support-v4的ViewPager.pageScrollEvents新增rxbinding-recyclerview-v7的RecyclerView.flingEventsTarget Java 8 bytecode要求使用 AGP 3.2 或更高版本并开启 Java 8 source/target 兼容废弃RxMenuItemCompat不再需要直接用RxMenuItem继续废弃简单 consumer引导用户改用方法引用。flingEvents在 4.x 仓库中的实现见 RecyclerViewFlingEventObservable.kt它通过RecyclerView.OnFlingListener发射包含velocityX/velocityY的RecyclerViewFlingEventdata class并在onDispose()时将onFlingListener置空以解除引用。五、1.0 时代API 稳定与新绑定批量落地5.1 1.0.02016-12-011.0.0 是首个稳定版本新增绑定覆盖平台、AppCompat、Design、Support v4 四组模块rxbindingToolbar的title/titleRes/subtitle/subtitleResView的keys按键事件。rxbinding-appcompat-v7Toolbar的title/titleRes/subtitle/subtitleRes。rxbinding-designBottomNavigationView.itemSelections导航项选中。rxbinding-support-v4NestedScrollView.scrollChangeEventsSlidingPaneLayout的open/panelOpens/panelSlidesViewPager的pageScrollStateChanges/currentItem。同时做了一项依赖瘦身rxbinding-support-v4现在只依赖support-core-ui。此外还修复了若干 Kotlin/Java 互操作细节KotlinAction的泛型在适用场景正确允许 null修正TextViewAfterTextChangeEvent.editable与TextViewEditorActionEvent.keyEvent的可空性标注——这两处可空性设计在 4.x 源码中依然可见例如 TextViewAfterTextChangeEventObservable.kt 中data class TextViewAfterTextChangeEvent(val view: TextView, val editable: Editable?)。5.2 1.0.12017-02-28仅一个修复降低 Kotlin 模块的方法数开销Reduce method count cost for Kotlin modules。六、0.x早期演进与模块版图成型6.1 0.1.02015-08-02Initial release首个版本发布确立了为平台与 Support Library 的 UI 控件提供 RxJava 绑定 API的项目定位。6.2 0.2.02015-08-23三大新模块与注解规范新模块rxbinding-appcompat-v7AppCompat、rxbinding-designDesign Support Library、rxbinding-recyclerview-v7RecyclerView均同时提供对应的-kotlin变体。新绑定RxSearchViewqueryTextChanges/queryTextChangeEvents/queryRxToolbar.itemClicksRxNavigationView.itemSelectionsRxSnackbar.dismissesRxTabLayoutselections/selectionEvents/selectRxRecyclerViewscrollEvents/scrollStateChangeEventsRxSwipeRefreshLayoutrefreshes/refreshingRxTextSwitchertext/currentTextRxViewattaches/attachEvents/detaches。注解规范为会生成 lint 警告的方法添加CheckResult为永不为 null 的方法/参数添加NonNull并移除显式 null 检查。其他Kotlin 模块更新到 v0.12.1230Support Library 升到 v23.0.0最低 SDK 版本提高到 14修复 Kotlin 模块对 Java 模块的依赖关系。6.3 0.3.02015-10-22Leanback 模块与事件类型收敛新模块rxbinding-leanback-v17及-kotlin面向 Leanback Support Library提供RxSearchBarsearchQuery/searchQueryChanges/searchQueryChangeEvents与RxSearchEditText.keyboardDismisses。新绑定覆盖RxAutoCompleteTextView.itemClickEvents、RxCheckedTextView.checked、RxMenuItem全家族actionViewEvents/checked/clicks/enabled/icon/iconRes/title/titleRes/visible、RxSeekBaruserChanges/systemChanges、RxTextViewafterTextChangeEvents/beforeTextChangeEvents/color/error/errorRes/hint/hintRes、RxToolbar.navigationClicks、RxViewdraws/globalLayouts/hovers/hoverEvents/layoutChanges/layoutChangeEvents/preDraws/scrollChangeEvents/systemUiVisibilityChanges、RxViewGroup.changeEvents、Design 组的RxAppBarLayout.offsetChanges、RxSwipeDismissBehavior.dismisses、RxTextInputLayout系列、RecyclerView 组的RxRecyclerView.scrollStateChanges、RxRecyclerViewAdapterchildAttachStateChangeEvents/dataChanges、Support v4 组的RxViewPager.pageSelections。事件类型收敛值无关紧要的绑定统一改为发射VoidKotlin 中为Unit移除了一批事件对象不携带任何额外信息除源 View 外的重载官方给出的迁移姿势是自行用map操作符合并例如RxFoo.bar(sourceView).map(data - new Pair(sourceView, data))被移除的重载包括RxCompoundButton.checkedChangeEvents、RxRadioGroup.checkedChangeEvents、RxRecyclerView.scrollStateChangeEvents、RxView.clickEvents/dragEvents/focusChangeEvents/hoverEvents/longClickEvents/touchEvents。这一决策与 4.x 源码中事件对象只保留必要信息的设计一脉相承。6.4 0.4.02016-02-18Kotlin 1.0 与更多平台绑定新增RxAbsListView.scrollEvents、RxAutoCompleteTextViewcompletionHint/threshold、RxPopupMenuitemClicks/dismissesplatform 与 appcompat 两组、RxActionMenuView.itemClicks、RxTextInputLayouterror/errorRes、RxMenuItemCompat.actionViewEvents。Kotlin 模块依赖更新到v1.0.0Kotlin 1.0 正式版。移除 76 个多余的 synthetic accessor 方法进一步压缩方法数。七、绑定 API 背后的统一实现模式源码级CHANGELOG 描述的是变而要理解这些绑定为何稳定可用还需要看不变的部分。从当前 4.x 仓库源码可以归纳出一套贯穿所有模块的统一实现模式7.1 主线程检查checkMainThread绝大多数绑定在订阅时调用 rxbinding/src/main/java/com/jakewharton/rxbinding4/internal/mainThread.kt 中的checkMainThread若当前线程不是主线程Looper.myLooper() ! Looper.getMainLooper()则立即通过onSubscribe(Disposable.empty())onError(IllegalStateException(...))拒绝订阅保证 Android UI 回调只在主线程被触碰。例如 ViewClickObservable.kt 与 RecyclerViewFlingEventObservable.kt 都以此为前置条件。7.2 监听器生命周期MainThreadDisposable 解绑每个 Observable 内部都持有一个同时实现平台监听器接口与MainThreadDisposable的内部类Listener订阅时observer.onSubscribe(listener)把Disposable交给下游然后注册监听器如view.setOnClickListener(listener)发射时先判断!isDisposed再observer.onNext(...)取消时在onDispose()中反注册监听器如view.setOnClickListener(null)/removeOnPageChangeListener(this)。Kotlin 文档注释KDoc明确警告Observable 会强引用View必须退订以释放引用否则可能造成内存泄漏。这与 CHANGELOG 中反复出现的Unsubscribe to free this reference是一致的。7.3 初始值绑定与纯事件绑定的分界需要初始值的绑定如queryTextChanges、pageSelections、afterTextChangeEvents继承InitialValueObservableT订阅即发射当前状态view.query、view.currentItem、view.editableText见 SearchViewQueryTextChangesObservable.kt纯事件绑定如clicks、pageScrollStateChanges继承普通ObservableT订阅时不发射任何值。测试 RxViewTest.java 中clicks()的o.assertNoMoreEvents(); // No initial value.正是对这一语义的验证。7.4 事件类 Kotlindata class3.0.0 将事件类从 AutoValue 改为 Kotlindata class后每个事件类型都自动获得equals/hashCode/toString与解构能力。仓库中TextViewAfterTextChangeEvent、RecyclerViewFlingEvent、PageScrollEvent、SearchViewQueryTextEvent等都是这一形态的典型代表rxbinding/src/main/java/com/jakewharton/rxbinding4/widget/TextViewAfterTextChangeEventObservable.kt、rxbinding-recyclerview/src/main/java/com/jakewharton/rxbinding4/recyclerview/RecyclerViewFlingEventObservable.kt、rxbinding-viewpager2/src/main/java/com/jakewharton/rxbinding4/viewpager2/PageScrolledObservable.kt。7.5 consumer 工厂的消亡与替代CHANGELOG 在 2.1.0/2.2.0 废弃、3.0.0 移除直接委托给方法的简单 consumer。以 ViewVisibilityConsumer.kt 为例它本身是把 Boolean 映射为View.VISIBLE/GONE的消费者其visibilityWhenFalse参数被严格限定为INVISIBLE或GONErequire校验VISIBLE会被拒绝。Material 模块中的 FloatingActionButtonVisibilityConsumer.kt 则是对show()/hide()的封装。对于这类能力3.0.0 的建议是直接向流订阅 lambda例如view::setEnabled式的方法引用来替代工厂方法。八、升级路线图从旧版本迁移到 rxbinding4综合 CHANGELOG从任意旧版本升级到 4.x 需要依次跨越三条主线RxJava 世代升级1.x → 2.x 引入InitialValueObservable、事件类型改抽象类子类、Void→Object3.x → 4.x 是纯 RxJava 3 切换无功能变化。若项目仍停留在 RxJava 1需先完成Observable语义差异如背压、Single/Completable等的适配。AndroidX 迁移3.0.0 起库为 AndroidX-only仍在使用旧 Support Library 的项目只能停留在2.2.0或先完成自身 AndroidX 迁移再升级。Kotlin-first API 形态3.0.0 起-kotlinartifact 消失事件类改为data classPredicate/Callable改为 Kotlin 函数类型Object通知改为Unit废弃方法与琐碎 consumer 全部移除。Java 调用方继续使用Function1即可推荐用 lambda。升级时的坐标对照group 前缀随版本变化版本世代groupId 示例包名前缀1.xcom.jakewharton.rxbinding:rxbinding:1.0.1com.jakewharton.rxbinding2.xcom.jakewharton.rxbinding2:rxbinding:2.2.0com.jakewharton.rxbinding23.xcom.jakewharton.rxbinding3:rxbinding:3.1.0com.jakewharton.rxbinding34.xcom.jakewharton.rxbinding4:rxbinding:4.0.0com.jakewharton.rxbinding4注2.x 时代的模块名带-v7后缀如rxbinding-appcompat-v7、rxbinding-recyclerview-v73.x/4.x 起已简化为无后缀形式rxbinding-appcompat、rxbinding-recyclerview4.x 还新增了rxbinding-core与rxbinding-viewpager2等模块。九、总结RxBinding 的 CHANGELOG 是理解其设计哲学的极佳入口它始终围绕为 Android UI 控件提供 RxJava 绑定这一主题历经三代 RxJava、一次 AndroidX 迁移、一次 Kotlin-first 重构在持续扩充绑定覆盖面的同时不断收敛事件类型、规范注解、清理废弃 API。当前仓库的 4.x 源码11 个 Gradle 模块、统一的InitialValueObservable基类、checkMainThread主线程校验与MainThreadDisposable生命周期管理正是这份演进史的最终落点——从 CHANGELOG.md 出发对照 settings.gradle、README.md 与各模块源码即可完整还原这一演进全貌并据此制定切实可行的迁移方案。赞分享移动开发【免费下载链接】RxBindingRxJava binding APIs for Androids UI widgets.项目地址https://gitcode.com/gh_mirrors/rx/RxBinding点击查看免费下载相关推荐docker-mailserver 版本演进全解从 v7 到 v16 的架构变迁与升级迁移指南docker mailserver 版本演进全解从 v7 到 v16 的架构变迁与升级迁移指南 本文以 CHANGELOG.md https://link.g后端通信云原生NeMo Guardrails 版本演进全解析从 0.1.0 到 0.24.1 的架构变迁、关键特性与升级指南NeMo Guardrails 版本演进全解析从 0.1.0 到 0.24.1 的架构变迁、关键特性与升级指南 NeMo Guardrails 是 NVIDI人工智能大模型AI 安全治理模型安全内容安全提示词注入防护RAGODrive 固件演进全解析从 0.1.0 到 0.5.6 的版本脉络、功能变迁与 API 迁移指南ODrive 固件演进全解析从 0.1.0 到 0.5.6 的版本脉络、功能变迁与 API 迁移指南 导读 本文以 ODrive 仓库根目录的 CHANGEL嵌入式固件硬件开发智能硬件机器人上一篇YuE2 乐谱编辑任务规范实战以编辑简报为核心将流行乐谱重配为现代人声爵士下一篇LeetCode 909 蛇梯棋Snakes and Ladders多语言 BFS 全解三种广度优先搜索写法与坐标转换原理创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑