跳转至

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

原文:https://www . geeksforgeeks . org/什么是 kotlin 中的流以及如何在 android 中使用它-project/

为了异步构建一个应用程序,我们必须使用 RxJava,这也是安卓开发中最重要的主题之一。但是现在在科特林,喷气大脑想出了流量应用编程接口。有了 Kotlin 中的 Flow,我们现在可以按顺序处理数据流了。Flow 是由 JetBrains 开发的 Kotlin 中的一个流处理 API。它是 Reactive Stream 规范的一个实现,该倡议的目标是为顺序执行的异步提供一个标准。喷气大脑在科特林科罗廷的基础上建立了科特林流。在 Kotlin 中,Coroutine 只是 RxJava 的调度程序部分,但现在有了 Flow APIs,它可以成为安卓系统中 RxJava 的替代品。

本文我们要构建什么?

在这篇文章中,我们将学习什么是 Kotlin 中的流,我们还将构建一个简单的安卓应用程序,其中我们将集成 Kotlin 流应用程序接口。

科特林的流动是什么?

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

分步实施

第一步:创建新项目

要在安卓工作室创建新项目,请参考如何在安卓工作室创建/启动新项目。请注意,选择 Kotlin 作为编程语言。

第二步:在你的等级文件中添加依赖关系。

导航到梯度脚本>构建.梯度(模块:应用)并添加以下代码。

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

导航到梯度脚本>构建.梯度(模块:项目)并添加以下代码。

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

步骤 3:使用 activity_main.xml 文件

导航到 app > res >布局> activity_main.xml 并将下面的代码添加到该文件中。下面是activity _ main . XML文件的代码。

可扩展标记语言

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <!-- Added a button in constraint layout -->
    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_constraintBottom_toBottomOf="parent"
        android:text="Launch Kotlin Flow"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        android:backgroundTint="237E26"/>

</androidx.constraintlayout.widget.ConstraintLayout>

第 4 步:使用 MainActivity.kt 文件

在活动的 onCreate()函数中,创建两个名为begin flow()&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<Int>

    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<Button>(R.id.button)
        button.setOnClickListener {
            CoroutineScope(Dispatchers.Main).launch {
                flow.collect {
                    Log.d(TAG, it.toString())
                }
            }
        }
    }
}

beginFlow()描述:

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

BTN nick()描述:

  • flow.collect 现在将作为 Dispatchers 在主线程上开始从流中提取值。Main 用于在 CoroutineScope 中启动 coroutine 构建器
  • 当我们点击按钮时,它会一个接一个地打印数值。

输出:

每当你点击点击这里按钮,你会在你的日志窗口看到如下输出。

对数猫输出:

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

我们一直在努力

apachecn/AiLearning

【布客】中文翻译组