17

Airbnb开源使用Kotlin进行Android应用开发的MvRx

 5 years ago
source link: http://www.infoq.com/cn/news/2018/09/airbnb-mvrx-android-framework?amp%3Butm_medium=referral
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

据Airbnb工程师Gabriel Peal介绍, MvRx (读作“mavericks”)帮助Android开发人员实现常见的特性,并把他们的应用与OS恰当地集成。 MvRx使用Kotlin编写,支撑着Airbnb所有的Android开发

MvRx提供了一种反应式应用开发框架,旨在减少开发人员需要编写的代码,按照Peal的说法,减少多达50%到70%。该框架以下面四个基本概念为基础:

  • 不可变状态,用于渲染UI。状态属性是 Observable<T> 的实例,因而可以在它们变化时用于触发特定的操作。
  • 视图,每当相关状态的属性发生变化就会进行渲染。视图可以看作是临时对象,每当它们的 invalidate 方法被调用时就会创建。视图可以关联到Fragments,响应 Android Lifecycle 。每个视图关联到一个或多个ViewModel。
  • ViewModel,拥有状态,用于处理应用的业务逻辑。ViewModel是唯一可以使用 setState 修改状态的对象,使用Kotlin的 复制机制 从当前状态返回一个新状态。ViewModel可以使用 withState 块访问它们的状态,保证所有挂起的 setState 操作完成后才会执行。如上所述,你可以 订阅 ViewModel中的状态变化。
  • Async操作,可以关联到State属性,以便每次状态属性发生变化时,可以执行相关操作。Async是一个密封类,有4个子类: UninitializedLoadingSuccessFail

下面是一个极其简单的例子,几个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 ,这是另一个来自Airbnb的框架,在RecyclerView中构建复杂的屏幕时非常有用。

要想充分利用MvRx还有许多方面需要考虑,包括线程、持久化、调试工具,因此,不要忘了查阅 官方文档维基

查看英文原文: Airbnb Open-sources MvRx for Android App Development in Kotlin


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK