我是为了考特琳·科鲁廷而做这件事的.从第6步到第7步,我应该更新此方法:

fun getPlantsWithGrowZone(growZone: GrowZone) = liveData {
    val plantsGrowZoneLiveData = plantDao.getPlantsWithGrowZoneNumber(growZone.number) // db
    val customSortOrder = plantsListSortOrderCache.getOrAwait() // network
    emitSource(plantsGrowZoneLiveData.map { plantList ->
        plantList.applySort(customSortOrder)
    })
}

对于这一条:

fun getPlantsWithGrowZone(growZone: GrowZone) =
    plantDao.getPlantsWithGrowZoneNumber(growZone.number) // db
        .switchMap { plantList ->
            liveData {
                val customSortOrder = plantsListSortOrderCache.getOrAwait() //network
                emit(plantList.applyMainSafeSort(customSortOrder))
            }
        }

代码实验室解释了第二个不同之处,即在映射中进行网络调用是安全的,因为它是缓存的.但我不明白为什么?

推荐答案

对功能进行这种更改似乎有两个目标,但第二个目标没有明确说明.

  1. 在与主线程不同的线程上进行排序,这样就不会降低用户界面性能.
  2. 每当数据库更新植物列表时,重新从网络获取分类方法,以防分类方法发生变化.在前面的代码中,排序方法只预先获取一次,然后在每次更新数据库中的植物列表时重新使用,因此排序顺序可能会过时.

要实现目标1:

步骤1是创建分类函数的一个版本,该函数是一个不在主线程上运行的挂起函数.在Suspend函数中使用withContext来将排序移动到不同的线程(通过使用不同的调度程序指定).

步骤2是在映射数据时使用此挂起功能.liveData.map函数的lambda不能调用挂起函数,因为它没有在协程中运行.它直接在主线程上运行.因此,我们必须改变映射数据的方法.

在另一个liveData { }协同程序构建器块周围使用switchMap允许我们在映射数据的同时调用挂起函数.协程被封装在使用协程构建器创建的新内部LiveData中.我相信当他们说"缓存"时,他们指的是这个内部的LiveData对象,但这个术语有点含糊.


要实现目标2:

对于数据库工厂列表的每个更改,我们已经切换到使用liveData { }协程构建器,因此我们可以继续,并将这个getOrAwait() Suspend函数调用移到内部LiveData中,以便每次都进行.


尽管如此,我们仍然有一点问题.每次数据库列表更改时,我们都会获得最新的排序顺序,但如果数据库列表没有更改,而排序顺序确实更改了,那么它将被保留为过时的.使用LiveData解决这一问题将非常复杂.但后来在CodeLab中,他们从LiveData切换到Flow,并使用Flow的combine运算符解决了这个问题.

Android相关问答推荐

以正确的方式从房间收集流量

错误:无法解析Symbol@style/Theme. Androidstudio in AndroidManifest.html for Kotlin Android Development''

长流与长流的比较<>

如何使用Jetpack Compose使水平pager 显示离屏页面?

Android应用程序中的背景问题

格雷德的两个星号是什么意思?非路径

在Android Studio中,如何在BuildSrc Dependenices Kotlin文件中指定时标记与旧版本的依赖关系

更改Jetpack Compose中选定的选项卡底线 colored颜色

有没有什么方法可以让Beeware在安卓手机上显示图片?

制作圆形SupportMapFragment

如何在同一行中滚动自定义布局和惰性列,就好像它们是一个组件一样

只能从同一个库组内调用成功(引用groupId=androidx.work from groupId=My Composable)

围绕动态大小的内容包装 Jetpack Compose Row?

如何像 XML 一样在 Compose Android Studio 中折叠/展开小部件代码区域/区域

android xml底部空间大

如何在 compose 中使用 BottomSheetScaffold 为底页设置半展开高度?

如何在 Android Studio 中创建新的可组合函数?

更改 Android SDK 版本 33 后建议在 xml 布局文件中不起作用

如何从我的 android 应用程序中删除 QUERY_ALL_PACKAGES 权限?

0dp 大小的可组合文件是否可以组合?