当前位置:主页 > android教程 > Android开发flow常见API

Android开发flow常见API的使用示例详解

发布:2023-03-02 11:00:01 59


我们帮大家精选了相关的编程文章,网友叶新林根据主题投稿了本篇教程内容,涉及到Android开发flow常见API、flow、API、Android开发flow常见API相关内容,已被596网友关注,涉猎到的知识点内容可以在下方电子书获得。

Android开发flow常见API

collect通知flow执行

public suspend inline fun  Flow.collect(crossinline action: suspend (value: T) -> Unit): Unit =
    collect(object : FlowCollector {
        override suspend fun emit(value: T) = action(value)
    })

flow是冷流,只有调用collect{}方法时才能触发flow代码块的执行。还有一点要注意,collect{}方法是个suspend声明的方法,需要在协程作用域的范围能调用。

除此之外,collect{}方法的参数是一个被crossinline修饰的函数类型,旨在加强内联,禁止在该函数类型中直接使用return关键字(return@标签除外)。

fun main() {
    GlobalScope.launch {
        flow {
            emit("haha")
        }.collect {
        }
    }
}

launchIn()指定协程作用域通知flow执行

public fun  Flow.launchIn(scope: CoroutineScope): Job = scope.launch {
    collect() // tail-call
}

这个方法允许我们直接传入一个协程作用域的参数,不需要直接在外部开启一个协程执行。本质上就是使用我们传入的协程作用域手动开启一个协程代码块调用collect{}通知协程执行。

这里看官方的源码有个tail-call的注释,也就是尾调用的意思,猜测这里可能官方会在这里进行了优化,减少了栈中方法调用的层级,降低栈溢出的风险。

fun main() {
    flow {
        emit("haha")
    }.launchIn(GlobalScope)
}

catch{}捕捉异常

public fun  Flow.catch(action: suspend FlowCollector.(cause: Throwable) -> Unit): Flow =
    flow {
        val exception = catchImpl(this)
        if (exception != null) action(exception)
    }

这个就是用来捕捉异常的,不过注意,只能捕捉catch()之前的异常,下面来个图阐述下:

即,只能捕捉第一个红框中的异常,而不能捕捉第二个红框中的异常。

merge()合流

public fun  merge(vararg flows: Flow): Flow = flows.asIterable().merge()

最终的实现类如下:

请注意,这个合流的每个流可以理解为是并行执行的,而不是后一个流等待前一个流中的flow代码块中的逻辑执行完毕再执行,这样做的目的可以提供合流的每个流的执行效果。

测试代码如下:

fun main() {
    GlobalScope.launch {
        merge(flow {
            delay(1000)
            emit(4)
        }, flow {
            println("flow2")
            delay(2000)
            emit(20)
        }).collect {
            println("collect value: $it")
        }
    }
}

输出日志如下:

map{}变换发送的数据类型

public inline fun  Flow.map(crossinline transform: suspend (value: T) -> R): Flow = transform { value ->
   return@transform emit(transform(value))
}

这个api没什么可将的,很多的地方比如集合、livedata中都有它的影子,它的作用就是将当前数据类型变换成另一种数据类型(可以相同)。

fun main() {
    GlobalScope.launch {
        flow {
            emit(5)
        }.map {
            "ha".repeat(it)
        }.collect {
            println("collect value: $it")
        }
    }
}

总结

本篇文章介绍了flow常见的api,接下来还会有一些列文章用来介绍flow的其他api,更多关于Android开发flow常见API的资料请关注码农之家其它相关文章!


参考资料

相关文章

  • Python写一个简单的api接口的实现

    发布:2023-04-11

    本文主要介绍了Python写一个简单的api接口的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧


  • Python基于Tensorflow2.X实现汽车油耗预测

    发布:2023-04-16

    这篇文章主要为大家详细介绍了Python基于Tensorflow2.X实现汽车油耗预测的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下


  • Python基于TensorFlow接口实现深度学习神经网络回归

    发布:2023-04-06

    这篇文章主要为大家详细介绍了如何基于Python语言中TensorFlow的tf.estimator接口,实现深度学习神经网络回归的具体方法,感兴趣的可以了解一下


  • tensorflow1.x和tensorflow2.x中的tensor转换为字符串的实现

    发布:2023-03-25

    本文主要介绍了tensorflow1.x和tensorflow2.x中的tensor转换为字符串的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧


  • Kotlin Flow封装类SharedFlow StateFlow LiveData使用对比

    发布:2023-03-04

    这篇文章主要为大家介绍了Kotlin Flow封装类SharedFlow StateFlow LiveData使用对比,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪


  • C++下如何将TensorFlow模型封装成DLL供C#调用

    发布:2023-03-13

    这篇文章主要介绍了C++下如何将TensorFlow模型封装成DLL供C#调用问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教


  • MacOS(M1芯片 arm架构)下安装tensorflow的详细过程

    发布:2023-03-31

    这篇文章主要介绍了MacOS(M1芯片 arm架构)下如何安装tensorflow,本节使用的版本是tensorflow2.4 python3.8,因此并未安装加速插件,本文结合实例代码详细讲解,需要的朋友可以参考下


  • Python代码连接到 Chat GPT API的方法

    发布:2023-04-08

    Chat GPT 由于其独特、近乎准确且类似人类的响应,如今在互联网上引起了过多的讨论,本文讨论如何通过 Python 代码连接到 Chat GPT API,感兴趣的朋友一起看看吧


网友讨论