在Google发布的最新Android体系结构组件库中,我们在Transformations类中具有两个静态函数。尽管map函数简单易懂,但我发现很难正确理解switchMap函数。

switchMap的官方文档可以在here中找到。

有人可以通过一个实际的例子来解释如何以及在哪里使用switchMap函数吗?

最佳答案

map()函数中

LiveData userLiveData = ...;
LiveData userName = Transformations.map(userLiveData, user -> {
     return user.firstName + " " + user.lastName; // Returns String
});

每次userLiveData的值更改时,userName也会被更新。注意,我们正在返回String

switchMap()函数中:
MutableLiveData userIdLiveData = ...;
LiveData userLiveData = Transformations.switchMap(userIdLiveData, id ->
    repository.getUserById(id)); // Returns LiveData

void setUserId(String userId) {
     this.userIdLiveData.setValue(userId);
}

每次userIdLiveData的值更改时,都会调用repository.getUserById(id),就像map函数一样。但是repository.getUserById(id)返回LiveData。因此,每次LiveData返回的repository.getUserById(id)的值更改时,userLiveData的值也将更改。因此userLiveData的值将取决于userIdLiveData的变化和repository.getUserById(id)的值的变化。
switchMap()的实际示例:假设您有一个用户配置文件,该用户配置文件带有“跟随”按钮和设置另一个配置文件信息的“下一个配置文件”按钮。下一个配置文件按钮将使用另一个ID调用setUserId(),因此userLiveData将会更改,UI也会更改。 “关注”按钮将调用DAO,向该用户添加一个关注者,因此该用户将拥有301个关注者,而不是300个关注者。userLiveData将具有来自存储库的更新,该更新来自DAO。

10-08 15:07