1 Flow的概念
关于流的概念,在RxJava中就有提及。数据流是可以通过异步的方式来处理一组数据,而不仅仅是单个数据的处理,而且不会阻塞主线程
2 Flow的创建和使用
Kotlin中,Flow的创建是通过flow来完成,Repository相当于是一个创造者,通过emit注射发送给消费者(UI)
Repository
suspend fun getCurrentAlarm(): Flow<Alarm> {
return flow {
var alarm = iWeatherDataSource.getCurrentWeather()
emit(alarm)
}
}
Flow的使用是需要在协程中使用
fun getCurrentWeather() : MutableLiveData<Alarm>{
val result:MutableLiveData<Alarm> = MutableLiveData<Alarm>()
viewModelScope.launch {
repository.getCurrentAlarm().collect {
result.postValue(it)
}
}
return result
}
3 StateFlow和SharedFlow
3.1 StateFlow
StateFlow和LiveData一样,都能够实时感知数据的变化,StateFlow也是流中的一种体现,监听数据需要在协程中使用
fun getCurrentWeather() : MutableStateFlow<Alarm>{
var result:MutableStateFlow<Alarm> = MutableStateFlow(Alarm())
viewModelScope.launch {
repository.getCurrentAlarm().collect {
result.value = it
}
}
return result
}
在Fragment中,通过lifecycleScope可以创建协程,通过collect来收集变量的数据
lifecycleScope.launch {
newsModel.getCurrentWeather().collect {
tv_show.text = it.reason
}
}
但是StateFlow和LiveData的不同之处在于: (1)创建StateFlow实例,需要赋初始值,但是LiveData不需要; (2)当View进入STOPPED的时候,LiveData.observe会自定取消注册使用方;但是StateFlow不会
3.2 SharedFlow
稍后介绍
|