如果您厌倦了阅读互联网相关状态流和共享流上的所有内容并想知道它们实际上是什么,那么在这篇博客中,我分享了一些对它的简单理解,并查看所有代码片段以便更好地理解。
状态流:
它是一个流 api,用于存储当前和更新的值状态。并在状态发生任何变化时通知消费者。
执行:
以下是视图模型和活动的代码。ViewModel 表现为生产者,而 Activity 表现为消费者。对于状态流,我们将使两个实例可变和不可变,正如您在视图模型类中看到的那样。_stateFlow 是可变的,而 stateFlow 是不可变的实例。所有改变值状态的操作都应用在视图模型中的 _stateFlow 上,消费者使用 stateFlow 实例,以便他们可以收集数据及其变化。
生产者:
class viewModel() : ViewModel() {
private val _stateFlow = MutableStateFlow(0); // Mutable State Flow
val stateFlow = _stateFlow.asStateFlow(); // Immutable State Flow
fun incrementCounter(){ // changes the state
_stateFlow.value +=1;
}
}
消费者:
class MainActivity : AppCompatActivity() {
lateinit var button: Button
lateinit var counter: TextView
val view_model:ViewModel = viewModel()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
button = findViewById(R.id.button)
counter = findViewById(R.id.counter)
lifecycleScope.launch {
repeatOnLifecycle(Lifecycle.State.STARTED) {
(view_model as viewModel).stateFlow.collectLatest { number ->
counter.text = number.toString()
}
}
}
button.setOnClickListener{
(view_model as viewModel).incrementCounter()
}
}
}
共享流程:
SharedFlow 是一种允许在多个收集器或消费者之间共享自身的流,因此只有一个流有效地为所有同时收集的收集器运行。
执行:
正如我已经制作了两个共享流实例,一个是可变的,另一个是不可变的。不可变实例将用于收集数据,我们将使用可变实例发出数据。通过调用 squareNumber() 函数,我们将以流的形式发出数据并从两个收集器或消费者那里收集数据。
class viewModel() : ViewModel() {
private val _sharedFlow = MutableSharedFlow<Int>() // Mutable Share Flow
val sharedFlow = _sharedFlow.asSharedFlow() // Immutable Share Flow
fun squareNumber(number:Int){
viewModelScope.launch {
_sharedFlow.emit(number * number)
}
}
init {
viewModelScope.launch {
sharedFlow.collect {
delay(2000L)
println("First Flow : The received Number is $it")
}
}
viewModelScope.launch {
sharedFlow.collect {
delay(3000L)
println("Secound Flow : The received Number is $it")
}
}
squareNumber(3)
}
}
代码: 状态流和共享流
链接:https://abdulmueez.hashnode.dev/android-state-flow-and-shared-flow
网友评论