gpt4 book ai didi

android-room - 每当设备恢复事件状态时,Kotlin Coroutines Flow with Room 再次运行

转载 作者:行者123 更新时间:2023-12-03 17:01:13 29 4
gpt4 key购买 nike

在使用 Kotlin Coroutines Flow、Room 和 Live Data 时,我面临着一个非常奇怪的行为。每当我关闭我的设备大约 5-10 秒然后重新打开它时,协程流程就会重新运行而没有任何触发。我不确定这是否是 Google 提供的功能。我的代码如下。

主事件

wordViewModel = ViewModelProvider(this).get(WordViewModel::class.java)

wordViewModel.allWords.observe(this, Observer { words ->

words?.let { adapter.setWords(it) }

})

WordViewModel
class WordViewModel(private val repository: WordRepository) : ViewModel() {

val allWords = repository.allWords.onEach { Log.v("WordViewModel", "Flow trigger again") }.asLiveData()

}

WordRepository
class WordRepository(private val wordDao: WordDao) {

val allWords: Flow<List<Word>> = wordDao.getAlphabetizedWords()

suspend fun insert(word: Word) {
wordDao.insert(word)
}
}

WordDao
@Dao
interface WordDao {

@Query("SELECT * from word_table ORDER BY word ASC")
fun getAlphabetizedWords(): Flow<List<Word>>

@Insert(onConflict = OnConflictStrategy.IGNORE)
suspend fun insert(word: Word)
}


@Entity(tableName = "word_table")
data class Word(@PrimaryKey @ColumnInfo(name = "word") val word: String)

LogCat V/WordViewModel: Flow trigger again当我关闭我的设备大约 5-10 秒并重新打开它时,将再次打印出来。另外,我用来测试的设备是在 Android 10 上运行的 Sony XZ2。

如果有人知道为什么会这样,请帮助我理解。感谢和抱歉我的英语。

编辑

作为@Alex Krafts 的回答,此功能由 Google 提供。但是因为我的 Kotlin Coroutines Flow 会与网络请求结合。因此,当设备处于事件状态时,我不希望它再次运行。我为这种情况编写了一个自定义的 asLiveData() 扩展函数,如下所示。

LiveDataExtension
fun <T> Flow<T>.asLiveData(scope: CoroutineScope): LiveData<T> {
val liveData = MutableLiveData<T>()
scope.launch {
collect {
liveData.value = it
}
}
return liveData
}

WordViewModel
class WordViewModel(private val repository: WordRepository) : ViewModel() {

val allWords = repository.allWords.onEach { Log.v("WordViewModel", "Flow trigger again") }.asLiveData(viewModelScope)

}

最佳答案

这个功能确实是谷歌提供的。您正在提供 MainActivity (这)为 LifecycleOwner

wordViewModel.allWords.observe(this, Observer { words ->

因此,当您关闭设备屏幕时,事件(由于其自身的生命周期)停止观察 allWords并在您重新打开设备屏幕时再次观察它。这就是您的日志的来源。

来自 documentation

After a cancellation, if the LiveData becomes active again, the upstream flow collection will be re-executed.

关于android-room - 每当设备恢复事件状态时,Kotlin Coroutines Flow with Room 再次运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60439871/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com