安卓Jetpack进阶——map与switchMap(一)

简介: 之前的文章中我们了解了Jetpack组件中ViewModel,LiveData与Lifecycle,在工作中,我已经明明白白的知道了他们的作用,我现在写的每个页面几乎都少不了它们

前言

之前的文章中我们了解了Jetpack组件中ViewModel,LiveData与Lifecycle,在工作中,我已经明明白白的知道了他们的作用,我现在写的每个页面几乎都少不了它们,当然,这也就避免不了我继续深入下去的心,于是我在官网又发现了Jetpack组件LiveData的两个好伙伴-map与switchMap。


网络异常,图片无法展示
|
网络异常,图片无法展示
|


可惜官网不够人性化,这部分的中文资料还是没有完善,不过我已经花费一段时间去阅读,下面就让我们看看它们庐山真面目。

正篇

出现背景与使用场景

在公司开发,大多数时候的项目还是比较复杂的,于是就会出现很多特殊的需求,而且代码也会讲究许多,也就是这个原因,LiveData为了去适应各种不同的需求场景,出现了两种转换方法:map()和switchMap()。 首先,让我们看看map():

map()方法的使用

使用方法的说明,我们就先举一个例子,假设你有了一个用户类Uer类,这个类包含用户姓名与年龄:

data class User(var firstName : String, var lastName : String, var age : Int)

于是我们可以在ViewModel中创建一个相应的LiveData去包含User类型数据:

class MainViewModel(countReserved: Int) : ViewModel() {
    val userLiveData = MutableLiveData<User>()
    ...
}

这时就有问题了,如果在Activity中这就会将整个User类型的LiveData暴露给外部,需求要是说年龄是隐私,不能泄露,我们明确只要用户姓名,这种情形下就是非常糟糕的了,而map()方法就是解决这个问题的:

class MainViewModel(countReserved: Int) : ViewModel() {
    private val userLiveData = MutableLiveData<User>()
    val userName : LiveData<String> = Transformations.map(userLiveData) { user ->
        "${user.firstName} ${user.lastName}"
    }
    ...
 }

这里代码说明了map()方法的作用就是将实际包含数据的LiveData和仅用于观察数据的LiveData进行转换。

上面的代码中需要用户的名称,于是我们调用了Transformations的map()方法去对LiveData数据类型进行转换,这个方法接受了两个参数,第一个是原始LiveData对象,第二个则是转换函数;


网络异常,图片无法展示
|


而我们需要在转换函数里编写具体的转换逻辑,而上述代码中转换逻辑也是十分简单的,即将User对象转换称一个只包含用户名称的字符串。


网络异常,图片无法展示
|


此外,为了保证数据的封装性,我们将userLiveData声明成private,这样在外部使用只要观察userName这个LiveData即可。


网络异常,图片无法展示
|


而当userLiveData数据发生变化时,map()方法会监听到变化而去执行转换函数中的逻辑,接着再将转换之后的数据告知userName观察者。

这样一套下来,我们的map()的工作就完成了,为了防止因为Konltin表达过于简单,导致我们认为转换逻辑方法比较难,我们再看看Java的写法:


网络异常,图片无法展示
|


源码也是十分清晰的:


网络异常,图片无法展示
|


仅仅就是返回你想要的类型即可。

结语

现在我们对map()方法有了一定的认知了,接下来,我们会去探究switchMap()方法,然后将二者结合使用再应用到我们的实例上演示一番,感谢您的观看!

相关文章
|
2天前
|
存储 设计模式 数据库
构建高效的安卓应用:探究Android Jetpack架构组件
【4月更文挑战第20天】 在移动开发的世界中,构建一个既高效又可维护的安卓应用是每个开发者追求的目标。随着Android Jetpack的推出,Google为开发者提供了一套高质量的库、工具和指南,以简化应用程序开发流程。本文将深入探讨Jetpack的核心组件之一——架构组件,并展示如何将其应用于实际项目中,以提升应用的响应性和稳定性。我们将通过分析这些组件的设计原则,以及它们如何协同工作,来揭示它们对于构建现代化安卓应用的重要性。
|
2天前
|
IDE API 开发工具
Google I/O :Android Jetpack 最新变化(四)Compose
Google I/O :Android Jetpack 最新变化(四)Compose
117 0
|
2天前
|
JSON IDE 测试技术
Google I/O :Android Jetpack 最新变化(二) Performance
Google I/O :Android Jetpack 最新变化(二) Performance
118 0
|
2天前
|
SQL API Android开发
Google I/O :Android Jetpack 最新变化(一) Architecture
Google I/O :Android Jetpack 最新变化(一) Architecture
76 0
|
2天前
|
安全 Android开发 开发者
构建高效Android应用:采用Kotlin与Jetpack的实践指南
【4月更文挑战第30天】 在移动开发领域,随着技术的不断进步,为了提高应用的性能和用户体验,开发者们不断地探索新的工具和框架。对于Android平台而言,Kotlin语言以其简洁性和功能性成为了开发的首选。而Jetpack组件则提供了一套高质量的库、工具和指南,帮助开发者更轻松地构建高质量的应用程序。本文将探讨如何结合Kotlin语言和Jetpack组件来优化Android应用的开发流程,提升应用性能,并保证代码的可维护性和可扩展性。
|
2天前
|
数据库 Android开发 开发者
构建高效Android应用:采用Kotlin与Jetpack的实践指南
【4月更文挑战第30天】 随着移动开发技术的不断演进,Android平台提供了多种工具和框架以提升应用性能和开发效率。在本文中,我们将深入探讨如何结合Kotlin语言的简洁性和Android Jetpack组件的强大功能来构建一个既高效又可维护的Android应用。通过分析现代Android应用架构的关键要素,我们将展示如何利用Kotlin的特性以及如何整合Jetpack中的LiveData、ViewModel和Room等组件,以实现响应式编程、数据持久化和生命周期管理。
|
2天前
|
存储 数据库 Android开发
构建高效Android应用:采用Kotlin与Jetpack的实践指南
【4月更文挑战第29天】 在现代移动开发领域,构建一个既高效又稳定的Android应用对于开发者来说是一个持续的挑战。随着技术的不断进步和用户需求的日益增长,传统的开发方法已不足以满足市场的要求。本文将深入探讨如何结合Kotlin编程语言以及Android Jetpack组件,来提升Android应用的性能、稳定性及开发效率。通过分析Kotlin的优势、介绍Jetpack的核心组件,并结合实际案例,我们将展示如何在实际项目中应用这些技术,以期达到优化应用架构、提高代码质量和加快开发流程的目的。
21 1
|
2天前
|
API Android开发
Google I/O :Android Jetpack 最新变化(三)UI
Google I/O :Android Jetpack 最新变化(三)UI
54 0
|
2天前
|
设计模式 前端开发 数据库
构建高效Android应用:使用Jetpack架构组件实现MVVM模式
【4月更文挑战第21天】 在移动开发领域,构建一个既健壮又易于维护的Android应用是每个开发者的目标。随着项目复杂度的增加,传统的MVP或MVC架构往往难以应对快速变化的市场需求和复杂的业务逻辑。本文将探讨如何利用Android Jetpack中的架构组件来实施MVVM(Model-View-ViewModel)设计模式,旨在提供一个更加模块化、可测试且易于管理的代码结构。通过具体案例分析,我们将展示如何使用LiveData, ViewModel, 和Repository来实现界面与业务逻辑的分离,以及如何利用Room数据库进行持久化存储。最终,你将获得一个响应迅速、可扩展且符合现代软件工
26 0
|
2天前
|
Android开发 开发者
什么是Android Jetpack,它包括哪些组件?
【4月更文挑战第17天】Android Jetpack是Google提供的一套工具集,助力开发者高效、稳定地开发Android应用。它包含架构、UI、行为和基础组件,简化了后台任务、导航和生命周期管理,使开发者能专注于创新。随着不断更新,如CameraX的推出,掌握Jetpack对开发者面试和工作至关重要。
22 0