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

再谈程之viewmodel-livedata难兄难弟

其实不能叫扯上关系吧,ViewModel和LiveData属于「架构组件」,而是「异步工具」,ViewModel和LiveData搭上了这条快车道,让Google推了几年的AAC架构更加快的让人接受了...的作用,它是连接ViewModel和Activity的桥梁,负责了数据的传递,所以,ViewModel和LiveData,完整了一个Activity的数据传递和数据生命周期的管理,将异步数据的请求流程,...除此之外,为了利用的结构化并发,ViewModel提供了viewModelScope来作为默认的可控生命周期的作用,所以,我们通常会抽象出一个ViewModel,封装viewModelScope...,这就是LiveData的作用,当LiveData被注册的时候,作用域中的代码就会被执行,而当LiveData不再被使用时,里面的操作就会因为结构化并发而取消。...而且该构造器返回的是一个不可变的LiveData,可以直接暴露给对应的UI层使用,作用域中,可以通过emit()函数来更新LiveData的数据。 这样整体流程就通了,而且,非常简单不是

1.1K40

如何正确的 Android 上使用

即使稳定版的已经发布了一年之余,但是好像并没有足够多的用户,至少在我看来是这样。学习的各个阶段,遇到问题都鲜有地方可以求助,抛到技术群基本就石沉大海了。...第一是 Medium 上热门文章的翻译,其实也翻译过: Android 上使用(一):Getting The Background Android 上使用(二):Getting started...大致意思是,Global scope 通常用于启动顶级,这些整个应用程序生命周期内运行,不会被过早地被取消。程序代码通常应该使用自定义的作用。...MainScope 官方文档中提到要使用自定义的作用,当然,Kotlin 已经给我们提供了合适的作用 MainScope 。...那么如何在 ViewModel 定义作用呢?还记得上面 MainScope() 的定义?没错,搬过来直接使用就可以了。

2.7K30
您找到你想要的搜索结果了吗?
是的
没有找到

的取消和异常 | 驻留任务详解

的最佳实践 由于本文所介绍的模式是的其它最佳实践的基础之上实现的,我们可以借此机会回顾一下: 1. 将调度器注入到 不要在创建或调用 withContext 时硬编码调度器。...您可以进行单元测试或仪器测试时轻松替换掉它们。 2. 应当在 ViewModel 或 Presenter 层创建 如果是仅与 UI 相关的操作,则可以 UI 层执行。...我们需要在 Application 创建自己的作用,并在由它启动的调用这些操作。这个作用应当被注入到那些需要它的。...当所需的生存期比调用处作用的生存期更长时,我们可以使用 applicationScope 来运行。...每当您需要执行一些超出当前作用范围的工作时,我们都建议您在您自己的 Application 创建一个自定义作用,并在此作用域中执行

1.4K20

理解、LiveData 和 Flow

而在 Presentation 层内部也有进一步的解决方案: 让一个对象可以 Activity 和 Fragment 被销毁、重新创建时依然留存,这个对象就是架构组件的 ViewModel 。...实际应用,以我们的 Android Dev Summit 应用为例,里面涉及到的作用非常多。...此外我们还有很多 Activity,而和它们相关的 ViewModel作用就是这些 Activity。 您也可以自定义作用。比如针对导航组件,您可以作用限制登录流程或者结账流程。...如何启动和取消协 Jetpack 组件里,我们为各个组件提供了对应的 scope,比如 ViewModel 就有与之对应的 viewModelScope,如果您想在这个作用里启动,使用如下代码即可...绝大部分情况下,的取消操作是自动的,毕竟我们在对应的作用里启动一个时,也同时明确了它会在何时被取消。但我们有必要讲一讲如何在内部来手动取消协

2.1K20

知识点 | ViewModel 四种集成方式

下面的文章将介绍 ViewModel 的四种集成方式: ViewModel 的 Saved State —— 后台进程重启时,ViewModel 的数据恢复; NavGraph 中使用 ViewModel...上面的代码使用了 GlobalScope,正如我们不推荐随意使用全局变量一样,这种方式通常不推荐使用。所以,如果想要使用,您要么限定一个作用 (scope),要么获得一个作用的访问权限。...而在 ViewModel ,我们可以使用 viewModelScope 来管理作用。...这样一来,只要您使用了 ViewModel,您就可以使用 viewModelScope ViewModel 启动各种,而不用担心任务泄漏。...根据 LiveData 自动更新; ViewModel 中使用 Kotlin 时,使用 viewModelScope 来让 ViewModel 被销毁时自动取消。

2.5K20

知识点 | ViewModel 四种集成方式

下面的文章将介绍 ViewModel 的四种集成方式: ViewModel 的 Saved State —— 后台进程重启时,ViewModel 的数据恢复; NavGraph 中使用 ViewModel...上面的代码使用了 GlobalScope,正如我们不推荐随意使用全局变量一样,这种方式通常不推荐使用。所以,如果想要使用,您要么限定一个作用 (scope),要么获得一个作用的访问权限。...而在 ViewModel ,我们可以使用 viewModelScope 来管理作用。...这样一来,只要您使用了 ViewModel,您就可以使用 viewModelScope ViewModel 启动各种,而不用担心任务泄漏。...根据 LiveData 自动更新; ViewModel 中使用 Kotlin 时,使用 viewModelScope 来让 ViewModel 被销毁时自动取消。

22620

Android的7个必要知识点

通过掌握挂起函数的调用、编写和异常处理,你可以更好地处理异步操作,确保代码的可靠性和稳定性。 作用 异步编程的生命周期和范围管理是至关重要的。...作用通常与Activity、Fragment或ViewModel等相关联,以确保组件销毁时取消所有,避免资源泄漏。...创建作用 Kotlin,我们可以使用CoroutineScope来创建作用。...launch { // 作用内启动 // 该将继承外部作用的上下文和调度器 } 作用的嵌套 作用可以嵌套,内部作用会继承外部作用的上下文。...通过使用launch函数,我们可以不同的同时执行多个任务,而这些可以相同的作用内运行,继承相同的上下文和调度器。

45641

Android 开发中使用 | 上手指南

scope.launch { // 这段代码作用里启动了一个新 // 它可以调用挂起函数 fetchDocs() } 您可以将 launch 看作是将代码从常规函数送往世界的桥梁...也就是说,如果某个协启动了另一个新的,它们都会在同一个 scope 终止运行。...还记得一开始说的结构化并发是一系列编程语言特性和实践指南的集合, suspend 函数引入无关联作用违背了结构化并发规则。...使用结构化并发 在这篇文章介绍了结构化并发,并展示了如何让我们的代码配合 Android ViewModel 来避免出现任务泄漏。...实现这种结构化并发,会为我们的代码提供一些保障: 作用取消时,它内部所有的也会被取消; suspend 函数返回时,意味着它的所有任务都已完成; 报错时,它所在的作用或调用方会收到报错通知。

1.4K20

【Kotlin 底层实现 ④ ( 结构化并发 | viewModelScope 作用示例 )

文章目录 一、viewModelScope 作用作用 二、viewModelScope 作用示例 常见的 CoroutineScope 作用 : GlobalScope : 该作用是 进程级别的..., 与应用进程同级 , 即使 Activity 被销毁 , 任务也可以继续执行 ; MainScope : 该 作用仅在 Activty , 如果 Activity 被销毁 , 则 onDestory...生命周期函数取消协任务 ; viewModelScope : 该作用与仅在 ViewModel 中使用 , 与 ViewModel 生命周期绑定 ; lifecycleScope : 该作用与仅在...Activity 中使用 , 与 Activity 生命周期绑定 ; 一、viewModelScope 作用作用 ---- viewModelScope 作用 需要绑定 ViewModel 生命周期..., 特定界面 , 如可旋转屏幕的 Activity 界面 , 如果使用 MainScope 作用 , 当屏幕旋转时 , 就会在 onDestory 生命周期函数 取消协作用 , 此时相关的临时数据都被取消了

91320

即学即用Kotlin -

上面的代码可以分为三部分,分别是 GlobalScope、Dispatcher 和 launch,他们分别对应着作用、调度器和协构建器,我们挨个儿介绍。...作用 作用有三种,他们分别是: runBlocking:顶层函数,它和 coroutineScope 不一样,它会阻塞当前线程来等待,所以这个方法在业务并不适用 。...GlobalScope:全局作用可以整个应用的声明周期中操作,且不能取消,所以仍不适用于业务开发。 自定义作用:自定义作用,不会造成内存泄漏。...显然,我们不能在 Activity 调用 GlobalScope,这样可能会造成内存泄漏,看一下如何自定义作用,具体的步骤注释已给出: class MainActivity : AppCompatActivity...lifecycleScope 是使用的 Lifecycle 的扩展库当中的,你可以替换成自定义的作用。 2.

1.5K20

ViewModel再问—字节真题

为什么ViewModel可以跟随Activity/Fragment的生命周期而又不会造成内存泄漏呢? ViewModelScope了解ViewModel怎么实现自动处理生命周期?...ViewModelScope了解 这里主要就是考ViewModel和其他一些组件的关系了。关于,之前也专门说过一篇,主要用作线程切换。...如果在多个协,需要停止某些任务,就必须对这些进行管理,一般是加入一个CoroutineScope,如果需要取消协,就可以去取消这个CoroutineScope,他所跟踪的所有都会被取消。...GlobalScope.launch { longRunningFunction() anotherLongRunningFunction() } 但是这种全局使用方法,是不被推荐使用的,如果要限定作用的时候...所以只要使用了 ViewModel,就可以使用 viewModelScope ViewModel 启动各种,而不用担心任务泄漏。

1.7K20

快速进阶 Kotlin Flow:掌握异步开发技巧

假设我们需要从网络获取用户列表,然后将其存储到 Room 数据库,最后通过 ViewModel 将数据展示界面上。...允许函数执行过程挂起,等待某些条件满足后恢复执行。Flow 利用了这一特性来实现数据流的处理。 Flow 内部,数据流被建模为一系列的悬挂函数调用。...每次发射数据时,发射器会暂停并将数据传递给订阅者。而订阅者收集数据时会挂起,并等待数据传递。这样,通过的挂起和恢复机制,Flow 实现了数据的异步传递和处理。 此外,Flow 还支持冷流的特性。...使用作用 Flow 中进行取消操作时,建议使用作用来确保操作的一致性。通过 coroutineScope 函数,你可以创建一个作用,然后作用内启动 Flow 操作。...集成 Kotlin Flow 是 Kotlin 的一部分,因此它天生与 Kotlin 无缝集成。这意味着你可以同一个代码块中使用和 Flow,实现更加一致和清晰的异步编程。

76730

Kotlin | 关于异常处理,你想知道的都在这里

,我们常用的 CoroutineScope,正是基于这样的特性,即其也有自己的作用与层级概念。...不是已经使用了 SupervisorJob() ?...但实则不会,因为子 launch 时会创建新的作用,其会使用默认新的 Job 替代我们传递 SupervisorJob ,所以导致我们传递的 SupervisorJob 被覆盖。...我们 launch 时,因为启动了一个新的作用,而新的作用内部已经是新的线程(可以理解为),因为内部发生异常时因为没有被直接捕获 , 再加上其Job不是 SupervisorJob ,所以异常将向上开始传递...如下示例: 当子A 异常未被捕获时,此时 子B 和整个 作用 都将被异常取消,此时异常将传递到顶级 CoroutineExceptionHandler 场景推荐 严格意义上来说,所有异常都可以

76820

从 LiveData 迁移到 Kotlin 数据流

根据文档,stateIn 有三个参数:‍ @param scope 共享开始时所在的作用范围 @param started 控制共享的开始和结束的策略 @param initialValue...started 接受以下的三个值: Lazily: 当首个订阅者出现时开始, scope 指定的作用被结束时终止。 Eagerly: 立即开始,而在 scope 指定的作用被结束时终止。...如果设置为 0,可以符合条件时立即重置缓存的数据。 从视图中观察 StateFlow 我们此前已经谈到,ViewModel 的 StateFlow 需要知道它们已经不再需要监听。...Fragment.lifecycleScope.launch : 立即启动,并且本 Fragment 销毁时结束。...Fragment.viewLifecycleOwner.lifecycleScope.launch : 立即启动,并且本 Fragment 的视图生命周期结束时取消协

1.4K20

【Kotlin 底层实现 ② ( 调度器 | 任务泄漏 | 结构化并发 )

文章目录 一、调度器 二、任务泄漏 三、结构化并发 一、调度器 ---- 调度器 运行的 , 中有 3 种调度器 : Dispatchers.Main 调度器 : 主线程..., 表明执行任务出错 ; 任务 运行时 , 必须指定其 CoroutineScope 作用 , 其会追踪所有的 任务 , CoroutineScope 作用 可以取消 所有由其启动的任务...; 常见的 CoroutineScope 作用 : GlobalScope : 该作用是 进程级别的 , 与应用进程同级 , 即使 Activity 被销毁 , 任务也可以继续执行 ; MainScope...: 该 作用仅在 Activty , 如果 Activity 被销毁 , 则 onDestory 生命周期函数取消协任务 ; viewModelScope : 该作用与仅在 ViewModel...中使用 , 与 ViewModel 生命周期绑定 ; lifecycleScope : 该作用与仅在 Activity 中使用 , 与 Activity 生命周期绑定 ;

56320

【Kotlin 底层实现 ③ ( 结构化并发 | MainScope 作用 | 取消协作用 | Activity 实现 CoroutineScope 作用接口 )

作用 : GlobalScope : 该作用是 进程级别的 , 与应用进程同级 , 即使 Activity 被销毁 , 任务也可以继续执行 ; MainScope : 该 作用仅在 Activty... , 如果 Activity 被销毁 , 则 onDestory 生命周期函数取消协任务 ; viewModelScope : 该作用与仅在 ViewModel 中使用 , 与 ViewModel...是一个 函数 , 其返回值类型为 CoroutineScope 作用 ; 这是使用了设计模式的 工厂模式 , 生产一个 作用 实例对象 ; 之后的 操作都要定义作用域中 ;...Log.i("MainActivity", "GlobalScope : 主线程更新 UI") } 如果在 作用 , 执行一个挂起函数 , 如 delay 函数 , 则可以不用 Dispatchers.IO...CoroutineScope 的 launch 扩展函数 launch { // 作用, 该代码块执行任务 // Dispatchers.IO

1.1K10

的取消和异常 | 异常处理详解

如果它的子抛出了一个异常,就会导致 UI 作用 (UI scope) 被取消,并且由于被取消的作用无法开启新的,所有的 UI 组件都会变得无法响应。...如果您不希望这种事情发生,可以尝试创建 CoroutineScope 的 CoroutineContext 中使用 Job 的另一个扩展: SupervisorJob。...它们会创建一个子作用 (使用一个 Job 或 SupervisorJob 作为父级),可以帮助您根据自己的逻辑组织 (例如: 您想要进行一组平行计算,并且希望它们之间互相影响或者相安无事的时候)。...另一个示例如下: // Scope 控制的应用某一层级的 val scope = CoroutineScope(Job()) scope.launch { supervisorScope...而如果您在扩展中使用 coroutineScope 代替 supervisorScope ,错误就会被传播,而作用最终也会被取消。 小测验: 谁是的父级?

1.1K20
领券