首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Hilt 实战 | 创建应用级别 CoroutineScope

在遵循 协程最佳实践 时,您可能需要在某些类中注入应用级别作用域的 CoroutineScope,以便可以创建与应用生命周期相同的新协程,或创建在调用者作用域之外仍可以工作的新协程。...将类型的作用域限定到容器类中 成本很高,这是因为在组件销毁之前,被限定作用域的对象将一直存在于内存中,所以仅在真正需要限定作用域的场景使用。...Hilt 在编译期生成代码,以确保构造类型的实例时可以正确创建并传入所需依赖项,或者在条件不足时报错。使用 @Singleton 注解,将该类的作用域限定为 SingletonContainer。...然而,上述代码片段仍可以优化。协程中硬编码 Dispatcher 不是良好的实现,我们需要注入它们使得这些 Dispatcher 可配置并且易于测试。...也正是这些原因,使得它相对于诸如 IdlingThreadPoolExecutor 之类来说是一个更优解,并且非常不幸的是,当由于协程被编译成状态机而被挂起时,IdlingThreadPoolExecutor

1K10
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Kotlin协程解析系列(上):协程调度与挂起

    3.1 Job Job 是协程的句柄,赋予协程可取消,赋予协程以生命周期,赋予协程以结构化并发的能力。 Job是launch构建协程返回的一个协程任务,完成时是没有返回值的。...当父Job被取消后,所有的子Job也会被自动取消。 当子Job被取消或者出现异常后父Job也会被取消。 具有多个子 Job 的父Job 会等待所有子Job完成(或者取消)后,自己才会执行完成。...Lifecycle绑定生命周期,生命周期被销毁时,此作用域将被取消。...会与当前的UI组件绑定生命周期,界面销毁时该协程作用域将被取消,不会造成协程泄漏,推荐使用。...协程在常规函数基础上添加了suspend和resume两项操作用于处理长时间运行的任务。

    2K40

    实战 | 使用 Kotlin Flow 构建数据流 管道

    在 Android 中数据源或存储区通常是应用数据的生产者;消费者则是视图,它会把数据显示在屏幕上。...在示例代码中,我们首先从 API 获取消息,然后使用 emit 挂起函数将结果添加到 Flow 中,这将挂起协程直到收集器接收到数据项,最后我们将协程挂起一段时间。...安全收集 假设我们在 MessagesActivity 中,如果希望在屏幕上显示消息列表,则应该当界面没有显示在屏幕上时停止收集,就像是 Pancho 在刷牙或者睡觉时应该关上水龙头一样。...,并且在生命周期离开该状态时取消该协程。...如果您调用 repeatOnLifecycle 并传入 STARTED 状态,界面就只会在屏幕上显示时收集数据流发出的信号,并且在应用转到后台时取消收集。

    1.5K10

    Go通关23:如何通过Go来更好的开发并发程序 ?

    并行、并发 并行和并发的区别: 并行:两个或多个程序在「同一时刻」执行。 并发:两个或多个程序在「同一个时间段内」执行。...而并发执行的程序,只是在宏观的角度观察到有多个程序在 CPU 上执行,微观上是它们在 CPU 上被快速轮换执行。...对于进程、线程、协程,并发、并行,在我之前的文章中讲并发掌握时也有介绍过,感兴趣的可以过去瞅一眼。传送门在此Go通关09:并发掌握,goroutine和channel声明与使用!...Go 的 MPG 线程模型 之所以 Go 被认为是高性能开发语言,在于它在原生态支持「协程并发」。协程是一种用户线程,是轻量级线程。协程的调度完全取决于用户空间的代码控制。...协程拥有自己的寄存器上下文和栈,并存储在用户空间,协程在切换时无需切换到内核态来访问内核空间,切换速度极快。

    42021

    知识点 | ViewModel 四种集成方式

    Activity 和 Fragment 通常会在下面三种情况下被销毁: 从当前界面永久离开: 用户导航至其他界面或直接关闭 Activity (通过点击返回按钮或执行的操作调用了 finish() 方法...对应 Activity 实例被永久关闭; Activity 配置 (configuration) 被改变: 例如,旋转屏幕等操作,会使 Activity 需要立即重建; 应用在后台时,其进程被系统杀死:...CoroutineScope 可以持续跟踪协程的执行,它可以被取消。当 CoroutineScope 被取消时,它所跟踪的所有协程都会被取消。...viewModelScope 当 ViewModel 被销毁时,通常都会有一些与其相关的操作也应当被停止。 例如,假设您正在准备将一个位图 (bitmap) 显示到屏幕上。...; 在 ViewModel 中使用 Kotlin 协程时,使用 viewModelScope 来让协程在 ViewModel 被销毁时自动取消。

    2.6K20

    一文读懂进程、线程、协程、纤程和Virtual Threads之间的区别与关系

    线程的销毁 线程的销毁是指线程的执行结束以及释放相关资源的过程。Java中线程的销毁通常是自动进行的,但我们也可以通过一些手段来主动销毁线程。...3.1 线程的自动销毁 当线程的run()方法执行结束或抛出未捕获的异常时,线程将自动销毁。此时,线程的状态将变为终止状态(TERMINATED)。...3.1 临界区 临界区是指一个程序片段,多个线程同时访问该片段时可能引发竞态条件的区域。为了保证临界区的互斥访问,我们可以使用synchronized关键字来修饰方法或代码块。...消费者线程调用getContent()方法时,如果消息还未准备好,则进入等待状态;否则获取消息内容、标记消息已被消费,并通知其他线程。...Java运行时会根据一定的策略,将多个Virtual Thread调度到一个或多个物理线程上执行。这种调度方式可以提高并发性能,同时减少线程创建和销毁的开销。 3.

    4.2K32

    知识点 | ViewModel 四种集成方式

    Activity 和 Fragment 通常会在下面三种情况下被销毁: 从当前界面永久离开: 用户导航至其他界面或直接关闭 Activity (通过点击返回按钮或执行的操作调用了 finish() 方法...对应 Activity 实例被永久关闭; Activity 配置 (configuration) 被改变: 例如,旋转屏幕等操作,会使 Activity 需要立即重建; 应用在后台时,其进程被系统杀死:...CoroutineScope 可以持续跟踪协程的执行,它可以被取消。当 CoroutineScope 被取消时,它所跟踪的所有协程都会被取消。...viewModelScope 当 ViewModel 被销毁时,通常都会有一些与其相关的操作也应当被停止。 例如,假设您正在准备将一个位图 (bitmap) 显示到屏幕上。...; 在 ViewModel 中使用 Kotlin 协程时,使用 viewModelScope 来让协程在 ViewModel 被销毁时自动取消。

    54520

    ViewModel再问—字节真题

    之前我们说过一期ViewModel,但是有读者反映还是有些面试题不会回答,今天就节选一些再来看看 : ViewModel怎么实现自动处理生命周期? 为什么在旋转屏幕后不会丢失状态?...ViewModel怎么实现自动处理生命周期?为什么在旋转屏幕后不会丢失状态?为什么ViewModel可以跟随Activity/Fragment的生命周期而又不会造成内存泄漏呢?...} } } }); 这里的onRetainNonConfigurationInstance方法再说下,是会在Activity因为配置改变而被销毁时被调用...关于协程,之前也专门说过一篇,主要用作线程切换。...如果在多个协程中,需要停止某些任务,就必须对这些协程进行管理,一般是加入一个CoroutineScope,如果需要取消协程,就可以去取消这个CoroutineScope,他所跟踪的所有协程都会被取消。

    1.8K20

    网络服务器并发编程的几种方案对比

    工作几年来,历经多种编程语言进行服务器端的开发,对几种方案优劣对比整理如下: 一 多进程 优势:1 具有很好的可靠性,其中一个进程挂掉后,系统在整体上仍可正常运行;...优势: 1 编程简单,在每个线程中处理一个客户的连接,同步阻塞处理I/O,不易出错; 2 线程直接通讯简单; 劣势: 一个线程约占1M左右的堆栈空间,创建、调度以及销毁操作的开销仍然很大...Java 三 异步I/O 优势: 1 资源利用率高, CPU可以持续运转 2 系统开销低,可以同时创建大量的并发连接 劣势: 1 编程复杂,业务流程被划分成多个处理片段...,对问题反应不自然; 2 单核应用,不能很好利用多核优势 代表语言: node.js 四 协程 优势: 1 协程是非常轻量的线程(4K左右),调度非常快,通过系统线程可以并行运行在多核上...; 2 协程中I/O阻塞时,会自动交出CPU执行权,所以可以采用在协程中同步阻塞式编程; 劣势: 1 GC性能相对JVM较低,但会得到根本解决

    2K100

    Python asyncio之协程学习总结

    CPU有多少个核,因为协程本质上还是一个函数,当一个协程运行时,其它协程必须挂起。...仅当封装的协程没有捕获CancelledError异常或抛出CancelledError异常时,cancelled()才会返回True。 如果一个挂起的task被销毁,则其封装的协程不会被执行完。...不在Task上下文中调用该函数时返回None cancel() 请求取消任务 安排在事件循环的下一个循环中将CancelledError抛出到封装的协程中。...(这是为了防止取消一个子项而导致其他子项被取消。) asyncio.iscoroutine(obj) 如果obj是一个协程对象,该对象可能基于生成器或async def协程,则返回True。...ALL_COMPLETED当所有future结束或被取消时,函数将返回。 这个函数是一个协程。

    940100

    破解 Kotlin 协程(5) - 协程取消篇

    ,在其中执行网络请求,那么正常来说,这时候 getUserCoroutine 返回的 Deferred 可以当做一个子协程,它应当遵循默认的作用域规则,在父作用域取消时被取消掉,但现实却并不是这样: 13...② 处在异常抛出时,判断了是否已经被取消。...实际上如果网络请求被取消,这个回调确实会被调到,那么由于取消的操作是协程的由 Continuation 的取消发起的,因此这时候没必要再调用 continuation.resumeWithException...小结 这篇文章我们从线程中断的概念切入,类比学习协程的取消,实际上大家就会发现这二者从逻辑上和场景上有多么的相似。...最后我们还分析了一下 Retrofit 的协程扩展的一些问题和解决方法,这个例子也进一步可以引发我们对协程作用域以及如何将现有程序协程化的思考。

    1.8K50

    微信终端自研C++协程框架的设计与实现

    由于这些协程中同时只会有一个协程处于活跃状态,当前活跃的协程可以临时使用调用栈。当此协程被挂起时,将调用栈中的状态保存到自身的状态栈;当协程恢复运行时,将状态栈再拷贝到调用栈。...因为 Android JNI 和部分 RTOS 系统调用 会检查 sp 寄存器是否在线程栈空间内,如果不在则认为栈被破坏,程序会直接挂掉。...):协程之间存在调用和被调用关系,如协程 A 调用/恢复协程 B,协程 B 挂起/返回时只能回到协程 A 非对称协程与函数调用类似,比较容易理解,主流编程语言对协程的支持大都是非对称协程。...结构化并发在 owl 协程的实现其实并不复杂,本质上是一个树形结构: 核心理念是: 协程也是一个作用域 协程有父子关系 父协程取消,子协程也自动取消 父协程结束前,必须等待子协程结束 光说概念有点抽象...~SimpleActivity() {         // UI 销毁的时候取消所有子协程         scope_.cancel();         // scope_ 析构时会等待所有子协程结束

    2.4K31

    协程简单上手(线程切换)

    协程作用域所有协程都必须在一个协程作用域CoroutineScope内运行。一个 CoroutineScope 管理一个或多个相关的协程。协程如何开启呢?...比如launch(Dispatchers.IO){ //协程主体函数}Dispatchers.IO 指示此协程应在为 I/O 操作预留的线程上执行。那么当协程内部还需要切换线程的时候呢?...上面是针对某一个具体的协程取消,如果我想全部取消呢?比如界面销毁的时候,通过调用协程域的取消,位于这个协程域里面的协程都会取消。...Android为我们自动提供了一个viewmodelScope,他可以在配置改变引起的销毁重建时自动取消开启协程不用担心泄漏问题。...除 runTest 创建的顶级协程外,如果代码还创建了新的协程,则需要选择适当的 TestDispatcher,以控制这些新协程的调度方式,设置新协程的调度器。

    48850

    微信终端自研 C++协程框架的设计与实现

    由于这些协程中同时只会有一个协程处于活跃状态,当前活跃的协程可以临时使用调用栈。当此协程被挂起时,将调用栈中的状态保存到自身的状态栈;当协程恢复运行时,将状态栈再拷贝到调用栈。...因为 Android JNI 和部分 RTOS 系统调用 会检查 sp 寄存器是否在线程栈空间内,如果不在则认为栈被破坏,程序会直接挂掉。...):协程之间存在调用和被调用关系,如协程 A 调用/恢复协程 B,协程 B 挂起/返回时只能回到协程 A 非对称协程与函数调用类似,比较容易理解,主流编程语言对协程的支持大都是非对称协程。...结构化并发在 owl 协程的实现其实并不复杂,本质上是一个树形结构: 核心理念是: 协程也是一个作用域 协程有父子关系 父协程取消,子协程也自动取消 父协程结束前,必须等待子协程结束 光说概念有点抽象...~SimpleActivity() {         // UI 销毁的时候取消所有子协程         scope_.cancel();         // scope_ 析构时会等待所有子协程结束

    1.7K31

    协程简单上手(线程切换)

    协程作用域 所有协程都必须在一个协程作用域CoroutineScope内运行。一个 CoroutineScope 管理一个或多个相关的协程。 协程如何开启呢?...比如 launch(Dispatchers.IO){ //协程主体函数 } Dispatchers.IO 指示此协程应在为 I/O 操作预留的线程上执行。...上面是针对某一个具体的协程取消,如果我想全部取消呢?比如界面销毁的时候,通过调用协程域的取消,位于这个协程域里面的协程都会取消。...Android为我们自动提供了一个viewmodelScope,他可以在配置改变引起的销毁重建时自动取消开启协程不用担心泄漏问题。...除 runTest 创建的顶级协程外,如果代码还创建了新的协程,则需要选择适当的 TestDispatcher,以控制这些新协程的调度方式,设置新协程的调度器。

    66520

    (StateFlow & ShareFlow) VS (Flow & LiveData)来看业务适合哪个?

    得益于协程,数据流还可以异步生成数据。(可选)中介可以修改发送到数据流的值,或修正数据流本身。使用方则使用数据流中的值。...,当ViewModel观察的组件销毁调用onClear的时候自动取消协程,生命周期过长不采取一般在对数据进行处理的时候会使用2.lifecycleScope: 此范围内启动的协程会在 Lifecycle... 被销毁时取消;也可以通过when生命周期来指定何时开启,如果 Lifecycle 未至少处于所需的最低状态,则会挂起在这些块内运行的任何协程,注意是挂起而不是销毁时的取消,意味着还是会浪费资源。...一定要注意取消这个词和挂起的区别,挂起其实还是有订阅关系的当flow发射时还是会收到走collect上游并没有取消,但是取消就是协程作用域的取消collect函数不会执行了。...1.WhileSubscribed()当存在活跃订阅者(观察flow的协程域没有被取消)时flow函数也会活跃(执行flow函数),可配置最后一个订阅者取消订阅的超时时间进行取消flow函数运行也可以配置数据过期时间

    74440
    领券