为什么挂起不适用于实时数据?



我正试图重写我的Kotlin数据库接口,以便将其与协同程序一起使用,所以我暂停了所有函数。但是当我运行应用程序时,我得到了一个错误:不确定如何将Cursor转换为这个方法的返回类型。

失败代码:

@Dao
interface PostDao {
@Query("SELECT * FROM post")
suspend fun getAll(): LiveData<List<Post>>
}

构建失败的函数返回LiveData对象,这似乎是问题所在,因为如果我删除";"暂停";word或LiveData,该应用程序运行正常。

工作变体:

@Dao
interface PostDao {
@Query("SELECT * FROM post")
fun getAll(): LiveData<List<Post>>
}

有人能解释一下为什么它如此有效吗?有没有一种方法可以将suspend与返回LiveData的函数一起使用?

使用suspend函数返回LiveData实际上没有意义。生成LiveData实例是一个非阻塞操作,因此没有理由挂起它。在LiveData的情况下,阻止数据请求发生在后台,并在准备好时更新已返回的LiveData,而不是等待数据然后生成LiveData。

如果对数据使用suspend函数,则只返回List<Post>。调用这个suspend函数将使请求一次性挂起,直到数据准备好,然后在协程中返回。

如果你想不断地接收更新的数据,你需要的是一个协同程序流。由于Flow是,因此您不为其使用暂停功能:

@Dao
interface PostDao {
@Query("SELECT * FROM post")
fun getAll(): Flow<List<Post>>
}

然后在视图模型层中,您可以将其转换为LiveData:

val postsLiveData = repository.getAll().asLiveData()

或者你可以将其转换为热门StateFlow或SharedFlow,其中的共识似乎是它应该优先于LiveData,因为它与Android细节没有直接联系:

val postsSharedFlow = repository.getAll().shareIn(viewModelScope, SharingStarted.Eagerly, 1)

您可以在文档中阅读有关订阅SharedFlow和StateFlow的信息。

最新更新