Kotlin Flow 冷流 StateFlow 热流 StateFlow 的应用
Posted 安果移不动
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Kotlin Flow 冷流 StateFlow 热流 StateFlow 的应用相关的知识,希望对你有一定的参考价值。
Flow是冷流。简单来说。如果Flow有了订阅者Collector以后,发射出来的值才会存在内存中,
这和懒加载的概念很像
与之相对的是热流,StateFlow和SharedFlow 是热流,在垃圾回收之前,都是存在内存之中,
并且处于活跃状态
StateFlow 是一个状态容器式可观察数据流,可以向其收集器发出当前状态更新和新状态更新,还可通过其value属性读取当前状态值。
和livedata很像。
package com.example.android_flow_practice.viewmodel
import androidx.lifecycle.AndroidViewModel
import androidx.lifecycle.ViewModel
import kotlinx.coroutines.flow.MutableStateFlow
class NumberViewModel : ViewModel()
val number = MutableStateFlow(0)
fun increment()
number.value++
fun deincrement()
number.value--
fragment
package com.example.android_flow_practice.fragment
import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.viewModels
import androidx.lifecycle.lifecycleScope
import com.example.android_flow_practice.R
import com.example.android_flow_practice.databinding.FragmentArticleBinding
import com.example.android_flow_practice.databinding.FragmentNumberBinding
import com.example.android_flow_practice.viewmodel.ArticleViewModel
import com.example.android_flow_practice.viewmodel.NumberViewModel
import kotlinx.coroutines.flow.collect
class NumberFragment : Fragment()
private val TAG = "NumberFragment"
private val viewModel: NumberViewModel by viewModels()
private val mBinding: FragmentNumberBinding by lazy
FragmentNumberBinding.inflate(layoutInflater)
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?
): View?
// Inflate the layout for this fragment
return mBinding.root
override fun onActivityCreated(savedInstanceState: Bundle?)
super.onActivityCreated(savedInstanceState)
mBinding.apply
btAdd.setOnClickListener viewModel.increment()
btSubtraction.setOnClickListener viewModel.deincrement()
lifecycleScope.launchWhenCreated
viewModel.number.collect
mBinding.tvText.text = it.toString()
布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".fragment.NumberFragment">
<TextView
android:id="@+id/tv_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingVertical="10dp"
android:text="0"
android:textAlignment="center" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<Button
android:id="@+id/bt_add"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:text="+" />
<Button
android:id="@+id/bt_subtraction"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:text="-" />
</LinearLayout>
</LinearLayout>
以上是关于Kotlin Flow 冷流 StateFlow 热流 StateFlow 的应用的主要内容,如果未能解决你的问题,请参考以下文章
Kotlin 协程Flow 异步流 ③ ( 冷流 | 流被收集时运行 | 流的连续性 )
Kotlin Flow响应式编程,StateFlow和SharedFlow