首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    使用更为安全的方式收集 Android UI 数据流

    在 Android 应用中,通常需要从 UI 层收集 Kotlin 数据流,以便在屏幕上显示数据更新。...更新地图 } } } } 注意: 这些 API 在 lifecycle:lifecycle-runtime-ktx:2.4.0-alpha01 库或其更新的版本中可用...另一方面,在一些情况下,即使可能造成资源的浪费,令处于后台的内部数据流生产者保持活跃状态也会利于某些用例,如: 您需要即时刷新可用数据,而不是去获取并暂时展示陈旧数据。...在 Jetpack Compose 中安全地收集数据流 Flow.collectAsState 函数可以在 Compose 中收集来自 composable 的数据流,并可以将值表示为 State,以便能够更新...在它的代码块中,如果您需要在宿主生命周期处于某个 State 时重新执行一个代码块,可以调用挂起函数 Lifecycle.repeatOnLifecycle。

    96830

    你真的了解 Java 8 中的 lambda 表达式、方法引用、函数式接口、默认方式、静态方法吗

    (x); 4 }); 在原始的方式中,我们一般使用 foreach 的方式进行遍历,有了 Java8 的方式之后,我们可以用 forEach 方法,然后,再用 lambda 表达式的方式进行遍历...1s -> s.length() 在第二个测试中,我们使用的是静态方法引用来获取每个字符串的长度。 1String::length 在第三个测试中,我们使用的是实例方法引用。...是不是需要 new 一个对象呢,那么现在用构造函数引用又是怎么做的呢? 下面我们用一个例子讲解一下,在这个例子中,对象还是使用上面的 ClassMate。...函数式接口 什么是函数式接口呢? 这个名词在 Java 中以前是很少听到的,但是正是有了 Java 8 的横空出世,函数式编程也变得熟悉了。...② 如果上面接口中再加一个抽象方法,那么就不是函数式接口了。 下面,我们再通过继承来继承这个接口。

    1.2K20

    C++11 在析构函数中执行lambda表达式(std::function)捕获this指针的陷阱

    test_lambda_base 类的功能很简单,就是在析构函数中执行构造函数传入的一个std::function对象。...->清除成员变量->析构基类部分(从右到左)->析构虚基类部分 所以上面代码中在test_lambda_base的析构函数中执行子类test_lambda的成员变量fun时,fun作为一个std::...因为问题的原因不是lambda表达捕获的this指针不对,而是在基类的析构函数中,lambda表达式所捕获的this指针所指向的子类对象部分的数据已经无效,不可引用了。...,将fun对象复制了一份,所以当代码执行到lambda表达式时,fun并不是子类对象中已经析构的那个无效对象了。...//gcc下,这个fun已经不是test_lambda中的fun对象了 }) { } 所以这代码在gcc下能正常运行算是侥幸。

    1.7K10

    协程笔记

    挂起:suspend 在协程里suspend是一个重要的关键字,这个关键字只是起到的提醒的作用,当代码执行到suspend时,会从当前线程挂起这个函数,然后代码继续执行,而挂起的函数从当前线程脱离,然后继续执行...,直到遇到第一个挂起函数,才在子线程中执行挂起函数 ; 如果在主线程中启动协程 , 则该模式的协程就会直接在主线程中执行 ; 如果在子线程中启动协程 , 则该模式的协程就会直接在子线程中执行 ; 协程异常处理...,使用 actor 协程构建器来启动一个 actor: // 这个函数启动一个新的计数器 actor fun CoroutineScope.counterActor() = actorCoroutineScope 对象: val coroutineScope = CoroutineScope(context) coroutineScope.launch...{ ... } 这是比较推荐的使用方法,我们可以通过 context 参数去管理和控制协程的生命周期(这里的 context 和 Android 里的不是一个东西,是一个更通用的概念,会有一个

    87530

    写给Android工程师的协程指南

    这是一份写给Android工程师的协程指南,希望在平静的2023,给大家带来一些本质或者别样的理解。 引言 在 Android 的开发世界中,关于 异步任务 的处理一直不是件简单事。...挂起线程吗?还是挂起一个函数?恢复又是具体指什么?又是如何做到恢复的呢?...不是在runBlocking()里已经利用lambda表达式实例化了函数对象了吗? 不知道是否会有同学有这个疑问,所以这里依然需要解释一遍。...我们知道,在 kotlin 中,lambda 是匿名内部类的一种实例化方式(简化),所以这里只是给 runBlocking() 函数传递了所需要的方法参数。...每个任务将在一个可用的线程上运行,任务执行结束后,线程将返回线程池以供以后使用,并且通过在队列中等待任务来保持活动状态。

    1.5K40

    设计 repeatOnLifecycle API 背后的故事

    纵观全文,您将了解到在某些场景中使用特定协程 API 的危险程度、为 API 命名的困难程度以及我们决定在函数库中只保留底层挂起 API 的原因。...addRepeatingJob 执行了协程的工作,没有什么会阻止我在协程当中调用它,对吗?...这一点正是我们关于是否要在函数库中避免在 repeatOnLifecycle 之上提供封装接口的争论所在。...这样一来,launch 就应该存在于 API 名字中。 collect 是一个挂起函数。如果某个 API 不是挂起函数,就不应该带有 collect 字样。...并且当这个 API 实现时,使用的仍然是函数库的 alpha01 版本, alpha02 中加入的 repeatOnLifecycle API 语法检查器尚不可用。 您需要封装函数吗?

    88321

    kotlin 协程入门教程

    至于这么做有什么好处,官方给的答案是以最有效的方式在工作线程上分发已调度的任务。 协程相对java线程池的优势是什么 其实 kotlin 协程的核心优势有三个,分别是:轻量、挂起函数以及结构化并发。...至于 挂起函数 通过挂起与恢复解决了开发过程中的回调地狱问题。而结构化并发 则可以对一组协程进行统一的操作。关于它们的详细介绍,可以继续往下面看。...这里重要的不是语法糖,而是 suspend ,它表明该函数是挂起函数。...一般不建议使用 自定义 CoroutineScope,可用于实现主动控制协程的生命周期范围,比如 lifecycleScope、viewModelScope。...不同于java多线程,在kotlin 协程中,有父子协程的概念。

    20810

    Kotlin 协程实现原理解析

    Kotlin 中的协程通过 suspend 关键字来标记可以挂起的函数。协程构建器Kotlin 协程通过构建器(如 launch 和 async)来启动。...这些构建器是顶层函数,它们接受一个协程上下文(CoroutineContext)和一个协程体(lambda 表达式)。...在结构化并发中,可以使用coroutineScope函数创建一个新的作用域,它会等待所有启动的子协程完成后才会继续执行。...public interface CoroutineScope { public val coroutineContext: CoroutineContext}挂起函数挂起函数是一种特殊的函数,它可以在不阻塞线程的情况下暂停和恢复执行...当挂起函数暂停时,当前的执行状态被封装在Continuation对象中,包括函数的参数、局部变量和返回点。协程调度器可以使用这个对象在适当的时候恢复函数的执行。

    60010

    深入浅出Kotlin协程

    仅仅从概念层面去讲也可以总结出几条: 因为某些协程库的实现使用了任务分发(比如Kotlin),于是可以在协程函数(也就是Kotlin coroutine中的suspend方法)中无限递归调用自身而不会栈溢出...对于这样的方法,我们无法在常规方法中直接调用,只能在声明了接收suspend lambda原型的方法中才能调用,如内置的coroutine-builder: launch,async,当然也可以在另一个...注意一点runBlocking并非coroutine-builder,所以它不需要CoroutineScope来调用,仅仅是能够接收一个suspend lambda而已。...,那么在Kotlin协程中,它扮演的角色如何呢?...中是为了告诉编译器要对该函数进行尾递归优化,也即是不要分配多余的栈空间,直接复用前一个方法调用的slot。

    11.6K113
    领券