📜  Kotlin 中的 Flow 是什么以及如何在 Android 项目中使用它?

📅  最后修改于: 2022-05-13 01:55:23.097000             🧑  作者: Mango

Kotlin 中的 Flow 是什么以及如何在 Android 项目中使用它?

要异步构建应用程序,我们必须使用 RxJava,它也是 Android 开发中最重要的主题之一。但现在在 Kotlin 中,Jetbrains 提出了 Flow API。现在使用 Kotlin 中的 Flow,我们可以按顺序处理数据流。 Flow 是 JetBrains 开发的 Kotlin 中的流处理 API。它是 Reactive Stream 规范的一种实现,它的目标是为按顺序执行的异步提供标准。 Jetbrains 在 Kotlin Coroutines 之上构建了 Kotlin Flow。在 Kotlin 中,Coroutine 只是 RxJava 的调度程序部分,但现在有了 Flow API,它可以替代 Android 中的 RxJava。

我们将在本文中构建什么?

在本文中,我们将了解 Kotlin 中的 Flow 是什么,并且我们将构建一个简单的 Android 应用程序,我们将在其中集成 Kotlin Flow API。

Kotlin 中的 Flow 是什么?

Kotlin Flow API 是一种更好的异步处理顺序执行数据流的方法。通过使用 Flow 处理值流,我们可以通过编写少量代码以复杂的多线程方式转换数据。在科特林。

分步实施

第 1 步:创建一个新项目

要在 Android Studio 中创建新项目,请参阅如何在 Android Studio 中创建/启动新项目。请注意,选择 Kotlin 作为编程语言。

第 2 步:在成绩文件中添加依赖项。

导航到Gradle Scripts > build.gradle(Module: app)并添加以下代码。

implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.3"
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.3"

导航到Gradle Scripts > build.gradle(Module: project)并添加以下代码。

classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.3.61"

第 3 步:使用 activity_main.xml 文件

导航到app > res > layout > activity_main.xml并将以下代码添加到该文件。下面是activity_main.xml文件的代码。

XML


  
    
    


Kotlin
package com.mrtechy.gfg_flow
  
import android.content.ContentValues.TAG
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import android.widget.Button
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.collect
import kotlinx.coroutines.flow.flow
import kotlinx.coroutines.flow.flowOn
import kotlinx.coroutines.launch
  
class MainActivity : AppCompatActivity() {
     
    // declared a lateinit variable of Flow of Int type
    lateinit var flow: Flow
    
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
          
          // beginFlow function called
        beginFlow()
          
          // btnClick function called
        btnClicks()
    }
  
    // declared beginFlow()
    private fun beginFlow() {
        flow = flow {
            Log.d(TAG, "flow Start")
            (0..10).forEach {
                // Emit items with 500 milliseconds delay
                delay(500)
                Log.d(TAG, "Emitting value $it")
                emit(it)
  
            }
        }.flowOn(Dispatchers.Default)
    }
  
    // declared btnClicks()
    private fun btnClicks() {
        val button = findViewById


第 4 步:使用 MainActivity.kt 文件

在 Activity 的 onCreate()函数中创建两个名为beginFlow()btnClicks() 的函数。在 beginFlow()函数中,我们将定义流,在 btnClicks()函数中,我们将单击按钮以显示从流中发出的数据。

科特林

package com.mrtechy.gfg_flow
  
import android.content.ContentValues.TAG
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import android.widget.Button
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.collect
import kotlinx.coroutines.flow.flow
import kotlinx.coroutines.flow.flowOn
import kotlinx.coroutines.launch
  
class MainActivity : AppCompatActivity() {
     
    // declared a lateinit variable of Flow of Int type
    lateinit var flow: Flow
    
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
          
          // beginFlow function called
        beginFlow()
          
          // btnClick function called
        btnClicks()
    }
  
    // declared beginFlow()
    private fun beginFlow() {
        flow = flow {
            Log.d(TAG, "flow Start")
            (0..10).forEach {
                // Emit items with 500 milliseconds delay
                delay(500)
                Log.d(TAG, "Emitting value $it")
                emit(it)
  
            }
        }.flowOn(Dispatchers.Default)
    }
  
    // declared btnClicks()
    private fun btnClicks() {
        val button = findViewById

beginFlow() 说明:

  • 它将以 500 毫秒的延迟发出从 0 到 10 的值。
  • emit()函数用于发出数字。它是 FlowCollector 的一部分,可用作接收器。
  • flowOn() 类似于 RxJava 中的 subscribeOn()
  • 上面写的代码 flowOn 将在后台运行。

btnClick() 说明:

  • flow.collect 现在将开始从主线程上的流中提取值作为调度程序。 Main 用于 CoroutineScope 中的启动协程构建器
  • 当我们单击按钮时,它将一一打印值。

输出:

每当您单击单击此处按钮时,您都会在 logcat 窗口中看到如下输出。

日志输出:

flow Start
Emitting value 0
0
Emitting value 1
1
Emitting value 2
2
Emitting value 3
3
Emitting value 4
4
Emitting value 5
5
Emitting value 6
6
Emitting value 7
7

Emitting value 8
8
Emitting value 9
9
Emitting value 10
10