据 Airbnb 工程师 Gabriel Peal 介绍, https://github.com/airbnb/MvRx/ (读作 "mavericks") 帮助 Android 开发人员实现常见的特性, 并把他们的应用与 OS 恰当地集成. MvRx 使用 Kotlin 编写, 支撑着 Airbnb 所有的 Android 开发 https://medium.com/airbnb-engineering/introducing-mvrx-android-on-autopilot-552bca86bd0a .
MvRx 提供了一种反应式应用开发框架, 旨在减少开发人员需要编写的代码, 按照 Peal 的说法, 减少多达 50% 到 70%. 该框架以下面四个基本概念为基础:
不可变状态, 用于渲染 UI. 状态属性是 Observable<T> 的实例, 因而可以在它们变化时用于触发特定的操作.
视图, 每当相关状态的属性发生变化就会进行渲染. 视图可以看作是临时对象, 每当它们的 invalidate 方法被调用时就会创建. 视图可以关联到 Fragments, 响应 Android Lifecycle https://developer.android.com/guide/components/activities.html#Lifecycle . 每个视图关联到一个或多个 ViewModel.
ViewModel, 拥有状态, 用于处理应用的业务逻辑. ViewModel 是唯一可以使用 setState 修改状态的对象, 使用 Kotlin 的 复制机制 https://kotlinlang.org/docs/reference/data-classes.html#copying 从当前状态返回一个新状态. ViewModel 可以使用 withState 块访问它们的状态, 保证所有挂起的 setState 操作完成后才会执行. 如上所述, 你可以 订阅 https://github.com/airbnb/MvRx/wiki/Advanced-Concepts#subscribing-to-state-manually ViewModel 中的状态变化.
Async 操作, 可以关联到 State 属性, 以便每次状态属性发生变化时, 可以执行相关操作. Async 是一个密封类, 有 4 个子类: Uninitialized , Loading , Success 和 Fail .
下面是一个极其简单的例子, 几个 MvRx 类发起一个网络请求, 处理加载状态, 显示结果, 处理旋转和配置变更:
- data class MyState(val listing: Async<Listing> = Uninitialized) :MvRxState
- class MyViewModel(override val initialState: MyState) : MvRxViewModel<MyState>() {
- init {
- fetchListing()
- }
- private fun fetchListing() {
- ListingRequest.forId(1234).execute { copy(listing = it) }
- }
- }
- class MyFragment : MvRxFragment() {
- private val viewModel by fragmentViewModel(MyViewModel::class)
- override fun epoxyController() = simpleController(viewModel) { state ->
- if (listing() == null) {
- loaderRow()
- return
- }
- header {
- title(listing.title)
- }
- // 在这里编写 epoxy 模型的剩余部分...
- }
- }
上述示例还使用了 Epoxy https://github.com/airbnb/epoxy , 这是另一个来自 Airbnb 的框架, 在 RecyclerView 中构建复杂的屏幕时非常有用.
要想充分利用 MvRx 还有许多方面需要考虑, 包括线程, 持久化, 调试工具, 因此, 不要忘了查阅 官方文档维基 https://github.com/airbnb/MvRx/wiki .
来源: http://www.tuicool.com/articles/jUzA3mU