二、抽屉布局 这个抽屉布局通过主页面的左上角的菜单点击进行打开,因此我们首先添加一个菜单按钮和一个疫情新闻按钮,在HomePage中, ① 添加菜单 增加如下代码: navigationIcon...要打开抽屉布局,需要使用ScaffoldState中的drawerState,可以通过更改drawerState来控制打开或关闭抽屉布局,而要更改drawerState需要通过协程或其他挂起函数。...定义两个变量: val scaffoldState = rememberScaffoldState() val scope = rememberCoroutineScope() 一个是状态一个是协程作用域...() 代码添加位置如下图所示: 四、动态权限请求 在Compose中请求权限和之前有所不同,下面我们来看看要怎么做,就用一个相机权限来举例说明。...① ActivityResult API 这个ActivityResult API里面携带了很多常用的页面处理,包括了进入系统相机,下面我们将使用它,在使用之前,我们在DrawerView函数中创建两个变量
,最好是有一个项目让你去了解和学习,在开发中去增加你的使用,并且以后回头来看很快就能用上,哪怕你现在用不上,知识的储备是非常要必要的,能给你的未来更多机会。...之前用Java写网络框架时是通过Okhttp、Retrofit、rxJava、那么在Kotlin中就使用Retrofit和协程来操作,在app的build.gradle的dependencies{}闭包中添加如下代码...使用协程 suspend fun getEpidemicNews() = service.getEpidemicNews().await() /** * Retrofit网络返回处理...接着,await()函数中使用了suspendCoroutine函数来挂起当前协程,并且由于扩展函数的原因,我们现在拥有了Call对象的上下文,那么这里就可以直接调用enqueue()方法让Retrofit...Kotlin内置的Result.success()方法来包装获取的疫情新闻数据,然后就调用Result.failure()方法来包装一个异常信息。
对于 Kotlin 开发者,WorkManager 为协程提供了最佳的支持。在本文中,我将通过实践 WorkManager codelab 为大家展示 WorkManager 中与协程相关的基本操作。...协程。...所以我创建了: 一个简单的 BlurredImage 实体 一个用于插入和获取图片的 DAO 类 数据库 相关的实现代码请 点击这里。...如果您需要执行异步操作,比如在数据库中存储数据或者发起网络请求,在 Kotlin 中,我们推荐使用 CoroutineWorker。...CoroutineWorker 通过使用 Kotlin 协程来执行异步任务。 doWork() 方法是一个 suspend 方法。也就是说我们这里可以调用可挂起的 dao 函数。
目前为止 WorkManager 系列已经讨论过: Android Jetpack WorkManager | Android 中文教学视频 在这篇文章中,我们将讨论: 在 Kotlin 中如何使用 WorkManager...Java 实现的 Worker 类 (Worker、ListenableWorker 和 RxWorker) 之外,还有唯一一个使用 Kotlin 协程实现的 Work 类——CoroutineWorker...CoroutineWorker 的另一个特性是可以自动处理任务的暂停和取消,而 Worker 类需要实现 onStopped() 方法来处理这些情况。...您可以在 WorkManager 测试文档页面 和新的 使用 WorkManager 2.1.0 进行测试 的指南中了解更多相关信息。...测试工具的原始实现使得自定义 WorkManager 成为可能,这样一来我们便可以使其表现为同步执行,进而可以使用 WorkManagerTestInitHelper#getTestDriver() 来模拟延迟和测试周期性任务
出发点: 这个问题涉及到面试者对于异常处理的理解,以及在Flow中如何优雅地处理错误。应当强调对于协程中异常处理机制的熟练应用。 参考简答: 在Flow中,异常处理是至关重要的一部分。...通过使用catch操作符,可以捕获流中的异常并进行处理。需要注意的是,catch是在协程上下文中执行的,因此可以使用协程的异常处理机制。...问题:请详细说明在使用Flow时,如何实现对异步任务设置超时操作,以避免长时间等待。 出发点: 这个问题涉及到面试者对于超时操作的理解,以及如何处理超时操作。...参考简答: 在Flow中,可以使用withTimeout函数来实现超时操作。...在不同协程中更新StateFlow可能会导致竞态条件,因此需要确保在更新StateFlow时使用适当的同步机制,例如Mutex。
在安卓或者kotlin平台上使用协程是很简单的一件事情。...st->p->r->con con(yes)->e con(no)->p 协程的生命周期是在一系列的逻辑中实现的,背后是 Context-Dispatcher-Scheduler 的支持。...创建协程 launch/async 协程的创建有两个常用接口launch和async,两个接口的内部实现基本一致。...,可以在协程运行完成后返回结果。...此时的coroutine已经拥有了协程上下文,和默认的派发器和调度器。 CoroutineStart是一个枚举类。start干了啥?为什么一个枚举类的值可以直接当函数使用?
前言 文章接上篇,这一篇我们好好聊一聊协程的原理,通过上一篇的学习,相信大家对于如何使用协程已经非常熟悉了。...故事还得从上次的协程分享开始,由于大家对协程的实践并不多,所以大家对下面的这段代码如何执行争论不休: GlobalScope.launch { val a = async { 1...,如果你会使用协程,那你肯定知道协程中有 CoroutineScope、CoroutineContext 和 CoroutineDispatcher,这些都是使用过程中我们可以接触到的 API。...,比如协程的状态,协程和子协程的管理方式等等。...调度器都放在其他 coroutineContext 的前面,所以在执行协程的时候,可以做拦截处理。 同理,我们也可以使用 coroutineContext[Job] 获取当前协程。
: 1、通过CoroutineScope创建 2、在协程中创建 第一种方式,首先如何通过CoroutineScope创建?...,不会把job取消(会打印“4”),而且异常是job2所在协程抛出来的 3、协程中异常处理的流程源码分析 3.1、协程的三层包装 第一层:launch和async返回的job,封装了协程的状态,提供取消协程的接口...} 由以上代码分析可知 1、invokeSuspend(param)方法的具体实现是在编译的生成的,对应协程体的处理逻辑 2、当发生异常的时候,即outcome为Result.failure(exception...2、异常属于 CancellationException 时,不会取消父协程 3、使用SupervisorJob和supervisorScope时,即主从作用域,发生异常不会取消父协程,异常由所在的协程处理...3.3、CoroutineExceptionHandler的是如何生效的 在AbstractCoroutine中,处理异常的逻辑是在JobSupport接口中,默认是空的实现。
Kotlin | 从线程到协程,你是否还存在理解上的疑问 引言 在2022的今天,对于一个 Android 开发同学,如果你使用 Kotlin 作为主要开发语言,那么协程是必不可缺的 异步框架 。...背景 事情源自这样,今天早上在群里,发现有同学问到了这样一个问题: 协程A:开启一个等待页面,wait,等到B完成后显示成功 协程B:与下位机通讯,等到下位机回复成功后,通知A协程 notify 具体对话图示如下...对于初使用协程而言,我们的想法应该怎样转变,这也即本文的主章: 面对协程,我们应该怎样去接受解决思路的转变 解决方法 在阐述 [莫须有] 的思想之前,我先写出下面的不同解法,以便大家更好的体会差异: 1...协程 解析 在 Android 官网中,对协程的描述如下: 协程是一种并发设计模式,您可以在 Android 平台上使用它来简化 异步执行 的代码。...,从而获得与前者一致的体验; 所以协程具有如下的基本特点: 更轻量、 简化异步代码 而面对难解决的异步代码时,我们首要的不应该考虑如何去通知,而是看看能不能将任务拆分,比如将原有需要通知的这一步拆为三步走
为了不同的使用场景更易于适配,我们通过对 WorkManager 添加功能,提升了开发者在遵循后台任务限制方面的体验。 我们推荐使用 WorkManager 处理需立即执行的长时间运行任务。...() } catch (throwable: Throwable) { //进行清理并输出 return Result.failure() } } 在 doWork...⚠️⚠️⚠️ 下一步 现在大家已经知道何时以及如何利用长时间运行的 worker 了,那么可以进行下一步,开始在应用中实现它们。...和前台服务的详细指南,以及主题更多信息,请查阅: WorkManager 的高级指南|支持长时间运行的工作器 后台处理指南 Android 上的 Kotlin 协程 WorkManager 系列文章助您了解...: 周期性任务 自定义 WorkManager —— 基础概念 使用 Dagger 自定义 WorkManager Google IssueTracker 提交所遇到的任何问题,这将帮助我们第一时间优化特性和修复漏洞
,后面看到腾讯短信业务要企业级用户才能使用,就放弃了,自己造轮子显然不是一个明智的选择,不过鉴于这个功能在思路上非常的简单,所以简单实现了一下,不过不要小看这个demo,”麻雀虽小五脏俱全”就是它了,设计后端即...reified关键字 inline fun create():T = create(T::class.java) } //4.统一处理网络请求 //这里进行网络请求的处理,用到协程使得网络请求可以异步执行...LoginDemoNetwork { private val loginService = ServiceCreator.create() //suspend kotlin中协程的关键字...(e) } emit(result) } } 五、基于MVVM架构的模块组装 这一块主要是对fragment和viewModel进行设计,由于我们的需求比较简单...,所以这一块也实现的比较简单 //1.viewModel层设计 class LoginViewModel : ViewModel() { //创建了两个网络请求的liveData private
不同的语言对于协程都有不同的实现,甚至同一种语言对于不同平台的操作系统都有对应的实现。 我们kotlin语言的协程是 coroutines for jvm的实现方式。底层原理也是利用java 线程。...:kotlinx-coroutines-jdk8:1.4.3" // lifecycle对于协程的扩展封装 implementation "androidx.lifecycle:lifecycle-viewmodel-ktx...---------------- 1.网络上没有详细的关于协程的概念定义,每种语言、每个系统对其实现都不一样。...如: 高阶函数 源码实现类找不到 所以扎实的kotlin语法基本功是学习协程的前提。 实在看不懂得地方就反编译为java,以java最终翻译为准。 协程是什么?有什么用?...通过挂起和恢复让状态机状态流转实现把层层嵌套的回调代码变成像同步代码那样直观、简洁。 它不是什么线程框架,也不是什么高深的内核态,用户态。它其实对于咱们安卓来说,就是一个关于回调函数的语法糖。。。
本文介绍了我们在开发 2019 Android 开发者峰会 (ADS) 应用时总结整理的 Flow 最佳实践 (应用源码已开源),我们将和大家共同探讨应用中的每个层级将如何处理数据流。...在本文中,您将看到我们把应用从 "在所有层级使用 LiveData",重构为 "只在 View 和 ViewModel 间使用 LiveData 进行通讯,并在应用的底层和 UserCase 层架构中使用协程...优先使用 Flow 来暴露数据流 (而不是 Channel) 您有两种方法在协程中处理数据流: 一种是 Flow API,另一种是 Channel API。...您也可以通过视频回顾 2019 Android 开发者峰会演讲 —— 在 Android 上测试协程: 点击查看视频:v.qq.com/x/page/d303… 总结 因为 Flow 所提供的更加明确的约束和各种操作符...,但需要自己管理它的生命周期; 请考虑将基于回调的 API 转化为协程,以便在您的应用中更好、更惯用地集成 API; 使用 take 和 toList 操作符可以简化 Flow 的相关代码测试。
在使用和分析协程前,首先要了解一下: 协程是什么? 为什么需要协程? 协程最为人称道的就是可以用看起来同步的方式写出异步的代码,极大提高了代码的可读性。在实际开发中最常见的异步操作莫过于网络请求。...Kotlin协程实现层次: 基础设施层:标准库的协程API,主要对协程提供了概念和语义上最基本的支持; 业务框架层:协程的上层框架支持,基于标准库实现的封装,也是我们日常开发使用的协程扩展库。...图片 协程上下文控制协程生命周期和线程调度,使得协程和该组件生命周期绑定,组件销毁时,协程一并销毁,从而实现安全可靠地协程调用。这是在应用中最推荐的协程使用方式。...在结果成功获取时,调用resumeWith(Result.success(value))或者调用拓展函数resume(value);出现异常时,调用resumeWith(Result.failure(exception...5.2.2 状态机CPS 协程实际挂起是如何实现的? 这里首先通过一个示例来演示一下状态机。
在我回答了这个关于LiveData和Flow的问题后,我决定写这篇文章。在这篇文章中,我将解释如何在MVVM模式中使用Flow与LiveData。...View和ViewModel层中使用它。...❝注意:如果你在资源库中没有使用Flow,你可以通过使用liveData builder实现同样的数据转换功能。...,我们已经看到了如何在资源库层中使用Flow,以及如何用Flow和LiveData改变应用程序的主题。...如果你有一个长期运行的运算符,你可以使用buffer,这样直到buffer的所有运算符的执行将在一个不同的coroutine中处理,而不是在协程中对Flow collect。这使得总的执行速度更快。
主页面的底部我分为两个部分,目前是首页和收藏,首页需要显示好几个类型的新闻数据,那么我们先来做这一步,本文效果图如下: 正文 首先我们需要申请API,在天行API中申请如下图所示的API接口....通常我们Activity和ViewModel是绑定,之前我们在HomeActivity中创建了一个MainViewModel,然后我们在HomeActivity中再加一个HomeViewModel,代码如下...: val homeViewModel: HomeViewModel = viewModel() 同样我们需要在导航到HomePage中时增加导航控制器和homeViewModel,如下图所示:...二、网络图片加载 之前在Android的开发你肯定是了解过Glide框架的,那么现在在Compose中使用Coli库,这个库有什么优点呢?...Coil 是一个 Android 图片加载库,通过 Kotlin 协程的方式加载图片。
如果你想使用 Java 依赖,那就移除“-ktx”。 定义你的 work 做什么 在我们将多个任务连接在一起之前,让我们关注如何执行一项工作。我将会着重细说上传任务。...在代码中,我展示了两个返回示例:Result.success() 和 Result.failure()。还有一个 Result.retry() 选项,它将在之后的时间再次重试你的工作。...现在,如果你想使用除默认 Executor 之外的一些其他机制来运行你的工作,也是可以的!对协程(CoroutineWorker)和 RxJava(RxWorker)的开箱即用支持作为工作的手段。...Worker 实际上是 ListenableWorker 的一个实现,它默认在默认的 Executor 上运行你的工作,因此是同步的。...所以在这样的情况下,不要使用 WorkManager —— 坚持使用像 Kotlin 协程那样轻量的东西或创建自己的 Executor。
那么该如何解决呢?很简单,看WorkManager的定义,使用WorkManager就可以轻松解决。这里就不再拓展实现代码了,只要你继续看完这篇文章,你就能轻松实现。...JobScheduler,那么在API23以下又该如何呢?...兼容性与实现性进一步加大。 那么有没有统一的实现方式呢?当然有,它就是WorkManager,它的核心原理使用的就是上面所分析的结合体。...以上是逻辑代码,关键点是返回值Result.success(),它是一个Result类型,可用值有三个 Result.success(): 成功 Result.failure(): 失败 Result.retry...由于篇幅有限,这里就不一一展开,感兴趣的可以查看源码 4.2 PeriodicWorkRequest PeriodicWorkRequest是可以周期性的执行任务,它的使用方式与配置和OneTimeWorkRequest
本文介绍 viewModelScope 使用和内部实现方式,分析 ViewModel 是如何自动取消协程的。...ViewModel 引入协程 当我们在 ViewModel 里面需要引入协程,首先要在 ViewModel 中新建一个 CoroutineScope, 用来管理所有协程任务,同时需要 onCleared...viewModelScope 方式 注意 lifecycle-viewmodel-ktx 版本号: 2.1.0-beta01 viewModelScope 管理协程的方式与我们在 ViewModel 引入协程的方式一样...ViewModel 被销毁时内部会执行 clear() 方法,在 clear() 方法中遍历调用 closeWithRuntimeException 取消了 viewModelScope 的协程,实现流程非常清晰...MVVM 和协程,非常推荐在 ViewModel 中使用 viewModelScope 方式。
领取专属 10元无门槛券
手把手带您无忧上云