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

Kotlin + + Retrofit + MVVM优雅的实现网络请求

前言 最近一直闭关修炼Kotlin,说实话真香真好用,刚好公司准备交给我一个新项目,于是打算直接用Kotlin来构建项目。刚好整体架构搭建完毕了,于是把网络请求这一部分先分享给大家。...这次使用到的是 + retrofit +mvvm的模式,我这儿直接用一个简单的demo来看一下具体的实现方式吧。...网络请求在中,并且在IO调度单元,所以不用担会阻塞主线程 + ViewModel + LiveData实现 上面也只是简单的实现,只不过是换成了,在项目中,还可以进一步封装,方便使用前面也提到了...因为在进行请求的过程中,若此时ViewModel销毁,里面的正在请求的话,将无法销毁,出现内存泄漏,所以在ViewModel onCleared 里面,即使结束任务,参考代码如下。...于所学精,可能会有使用不当之处,希望各位大佬能指出不当的地方,深表感谢。 附上项目地址 最后 如果你看到了这里,觉得文章写得不错就给个赞呗?如果你觉得那里值得改进的,请给我留言。

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

Kotlin 】Flow 异步流 ① ( 以异步返回返回多个返回值 | 同步调用返回多个值的弊端 | 尝试在 sequence 中调用挂起函数返回多个返回值 | 中调用挂起函数返回集合 )

文章目录 一、以异步返回返回多个返回值 二、同步调用返回多个值的弊端 三、尝试在 sequence 中调用挂起函数返回多个返回值 四、中调用挂起函数返回集合 一、以异步返回返回多个返回值 ----...在 Kotlin Coroutine 中 , 使用 suspend 挂起函数 以异步的方式 返回单个返回值肯定可以实现 , 参考 【Kotlin 的挂起和恢复 ① ( 的挂起和恢复概念...| 的 suspend 挂起函数 ) 博客 ; 如果要 以异步的方式 返回多个元素的返回值 , 可以使用如下方案 : 集合 序列 Suspend 挂起函数 Flow 异步流 二、同步调用返回多个值的弊端...AnnotationTarget.CLASS) @Retention(AnnotationRetention.BINARY) public annotation class RestrictsSuspension 四、中调用挂起函数返回集合...---- 如果要 以异步方式 返回多个返回值 , 可以在中调用挂起函数返回集合 , 但是该方案只能一次性返回多个返回值 , 不能持续不断的 先后 返回 多个 返回值 ; 代码示例 : package

8.1K30

在 Android 开发中使用 | 背景介绍

通常我们把这类操作归类为耗时任务 —— 应用会停下并等待它们处理完成,这会耗费大量时间。 当今手机处理代码的速度要远快于处理网络请求的速度。...所以想让应用运行上 “卡”、做到动画能够流畅运行或者能够快速响应用户点击事件,就得让那些耗时的任务阻塞主线程的运行。 要做到处理网络请求不会阻塞主线程,一个常用的做法就是使用回调。...一旦网络请求返回结果,result 可用后,回调代码就会被主线程调用。这是一个处理耗时任务的好方法,类似于 Retrofit 这样的库就是采用这种方式帮您处理网络请求,并不会阻塞主线程的执行。...get 方法是如何做到不等待网络请求和线程阻塞而返回结果的?其实,是 Kotlin 中的提供了这种执行代码而阻塞主线程的方法。 在常规函数的基础上新增了两项操作。...在 Android 平台上,您可以使用来处理两个常见问题: 似于网络请求、磁盘读取甚至是较大 JSON 数据解析这样的耗时任务; 线程安全,这样可以在增加代码复杂度和保证代码可读性的前提下做到不会阻塞主线程的执行

1.5K30

kotlin 入门教程

为什么直接使用Java线程池 这里需要提前说明一下,kotlin 封装的线程池与 java 的线程池是不一样的。...println("main over") Thread.sleep(1500) } //执行结果: main over launch over 在 kotlin框架中,提供了...其实说挂起和恢复比较难理解,其实简单的说挂起就是任务从当前线程脱离,恢复则是任务回到了原线程。下面是常见的网络请求代码示例。...一般建议使用 自定义 CoroutineScope,可用于实现主动控制的生命周期范围,比如 lifecycleScope、viewModelScope。...Job 结束运行 deferred.await() //阻塞等待直到获取的执行结果 前面我们提到过,kotlin 的一大特点就是结构化并发。

11910

Kotlin开篇

Kotlin》均基于Kotlinx-coroutines 1.3.70 新开个坑,专门讲kotlin。聊程之前先说一下具体聊的是的什么内容。 · 是什么? · 什么时候用?...· 的核心是什么? · kotlin和其他语言的有什么异同? kotlin的出现其实比kotlin语言还晚一点。在当前这个版本,甚至都还处于一个不稳定的迭代版本中。...理解这句话的关键在于,干了什么,让这个异步操作不会卡主线程? 我们知道类似的技术在RxJava中也有,它通过手动切线程的方式指定代码运行所在的线程,从而达到卡主线程的目的。...而的高明和简洁之处在于,开发者不需要主动切线程。 在上面的代码中打印一下线程名观察结果。...熟悉计算机原理的能明白,当发生内核中断的时候,比如请求一个磁盘文件,中断发生时CPU其实是没有工作的,执行逻辑在这个时候处于一个空转,直到中断返回结果才继续往下执行。

86220

Android开发:使用Kotlin++自定义注解+Retrofit的网络框架

对项目的基本介绍 1.整个框架主要是给MVVM框架使用的,自己写完interface接口后,通过自定义的注解就能自动生成接口方法 2.用Kotlin的Flow去代替Rxjava,因为我发现RxJava功能很强大...,但是大家都只是在Http层面使用了一下,既然要用Kotlin里面就已经有Flow,那我还不如少添加一个库 3.通过jetpack的Room数据库实现网络请求的存储,缓存策略也用过注解去完成。...4.发起的网络请求是与宿主生命周期绑定的,在网络请求回来之前,宿主已经销毁的话,网络请求也会中断的 基本使用方法 1.先定义接口类 和Retrofit一样,需要定义一个接口类 其中@AutoApi,@AutoFlowApi...通过上述操作后,repositoryMap就存在所有使用过AutoAPi注解的类了,再将他做遍历,传入Repository类的生成器RepositoryClassBuilder [1240] 这个如果添加...AutoFlowApi注解介绍 ----------------- 使用注解生成的代码 下面分析一下生成方法的各个方法 [1240] viewModelScopeCoroutine 一个与viewmodel生命周期绑定的

1.2K50

Kotlin系列(三)

1.前言   前面两节,我们运用了kotlin提供的简单去实现了一套更易用的复合,这些基本上是以官方框架为范本进行设计和实现的。...虽然我们还没有直接接触kotlin官方框架,但对它的绝大多数功能已经了如指掌了。...async和launch函数的不同点在于launch函数启动的是没有返回值的,而async函数启动的是有返回值的。...通过上面的测试,我们可以得出结论,launch函数和async函数启动的是并行执行的,并且启动程之后会立马往下执行,不会等待完成,除非调用join或await函数。...launch函数和async函数的唯一区别就是async函数启动的返回值,如果不需要获取的执行结果,那么没必要用async函数。

21710

Android的7个必要知识点

的基本语法 在Kotlin中,使用launch函数创建和启动,它返回一个Job实例,代表了的生命周期。代码块位于launch函数的大括号内。...挂起函数 在Kotlin Coroutine中,挂起函数是一种特殊的函数,它可以在内部被挂起,等待异步操作完成而不会阻塞线程。挂起函数是异步编程的核心。...挂起函数的概念 挂起函数是具有suspend关键字修饰的函数,它可以在内部被挂起,等待某个操作完成后再继续执行。典型的例子包括网络请求、文件读写、数据库查询等异步操作。...suspend fun fetchUserData(): UserData { // 执行异步操作,等待数据返回 } 在中调用挂起函数 在内部调用挂起函数是直接的,你可以像调用普通函数一样调用挂起函数...,它会等待所有的子完成后再继续执行。

42640

使用和 Flow 简化 API 设计

// 等待 CompletionStage 的执行完成而阻塞线程 suspend fun CompletionStage.await(): T // 等待 ListenableFuture...的执行完成而阻塞线程 suspend fun ListenableFuture.await(): T 使用这些函数,您可以摆脱回调并挂起直到 future 的结果返回。...对于来说,理想的 API 是一个直接返回确切结果的挂起函数。 注意: 这一 API 返回值为 Task,并且已经有了对应的 适配器。出于学习的目的,我们用它作为范例。...如果该 lambda 返回结果,则将立即恢复;否则将会在 CancellableContinuation 被 lambda 手动恢复前保持挂起状态。...等待消费者取消协并注销回调。这一过程会挂起,直到 Flow 被关闭。

1.6K20

写给Android工程师的指南

相信不少同学在学习 Kotlin 的时候,常常会看到很多人(包括官网)会将线程与拉在一起比较,或者经常也能看见一些实验,比如同时启动10w个线程与10w个协,然后从结果上看两者差距巨大,线程看起来性能巨差...在相应的 getMessages() 方法上,我们增加了 suspend 标记,并在内部使用withContext(Dispatcher.IO) 将当前上下文环境切换到IO中,用于延迟等待(假设网络请求...),最终返回结果。...如下示例所示: 对于挂起函数而言,返回值有可能是 COROUTINE_SUSPENDED、Unit.INSTANCE 或者最终返回我们方法需要的返回类型结果,所以采用 Object 作为返回值以适应所有结果...故在某个角度而言,的性能相比恰当的使用线程池,是会更高。 所以如果我们的场景对性能有这极致要求,比如应用启动框架等,那么此时使用往往并不是最佳选择。

1.3K40

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

通常我们需要通过各种回调的方式去处理网络请求,很容易就陷入到地狱回调中。 图片上述示例是一个项目开发中常见的一个网络请求操作,通过接口回调的方式去获取网络请求结果。...async 创建一个新的,不会阻塞当前线程,必须在作用域中才可以调用,并返回Deffer对象。可通过调用Deffer.await()方法等待该子执行完成并获取结果。...区别在于:async的返回是Deferred对象,可通过Deffer.await()等待执行完成并获取结果,而 launch 不行。常用于并发执行-同步等待和获取返回值的情况。...它是async构建返回的一个任务,可通过调用await()方法等待执行完成并获取结果。其中Job没有结果值,Deffer有结果值。...Deferred继承自Job,是async构建返回的一个任务,可通过调用await()方法等待执行完成获取结果

1.7K40

使用kotlin提高app性能(译)

网络请求完成时,get恢复暂停的,而不是使用回调来通知主线程。 Kotlin使用堆栈框架来管理与任何局部变量一起运行的函数。挂起时,将复制并保存当前堆栈帧以供以后使用。...即使代码看起来像普通的顺序阻塞请求,也可以确保网络请求避免阻塞主线程。 Use coroutines for main-safety Kotlin使用调度程序来确定哪些线程用于执行。...因为协同程序支持挂起和恢复,所以只要withContext块完成,主线程上的就会以get结果恢复。 重要说明:使用suspend并不能告诉Kotlin在后台线程上运行函数。...启动一个 您可以通过以下两种方式之一启动协同程序: launch会启动一个新的,并且不会将结果返回给调用者。 任何被认为是“发射并忘记”的工作都可以使用launch来开始。...async启动一个新的协同程序,并允许您使用名为await的挂起函数返回结果。 通常,您应该从常规函数启动新,因为常规函数无法调用等待

2.3K10

Kotlin 实现原理解析

本文将深入探讨 Kotlin 的实现原理,并分析其关键源码。基础在深入源码之前,我们需要理解的基本概念。...launch构建器返回一个Job,而async返回一个Deferred,它是Job的子类,可以获取结果。...在结构化并发中,可以使用coroutineScope函数创建一个新的作用域,它会等待所有启动的子完成后才会继续执行。...当挂起函数暂停时,当前的执行状态被封装在Continuation对象中,包括函数的参数、局部变量和返回点。调度器可以使用这个对象在适当的时候恢复函数的执行。...通过这些机制,Kotlin 能够在阻塞线程的情况下挂起和恢复执行,从而实现高效的并发编程。

34010

Kotlin中的及在Android中的应用

前言 Kotlin底层是用线程实现的,是一个封装完善供开发者使用的线程框架。...提前说一下async和launch的区别: async函数体中最后一行代码表达式运行结果会作为结果返回,也就是Deferred中的泛型T,我们可以通过其他函数获取到这个执行结果,而launch没有这样的返回值...最常见的,网络请求在IO线程,而页面更新在主线程。 Kotlin给我们提供了一个顶层函数withContext用于改变的上下文并执行一段代码。..."返回结果" } mBtn.text = result } 名称 GlobalScope.launch(Dispatchers.Main + CoroutineName...两个扩展函数时,可以看到launch返回结果是一个Job,而async的返回结果是一个Deferred,Deferred其实是Job的子类。

9510

即学即用Kotlin -

前言 上周在内部分享会上大佬同事分享了关于 Kotlin 的知识,之前有看过 Kotlin 的一些知识,以为自己还挺了解的,结果......Kotlin - 基础篇》 《抽丝剥茧Kotlin - Flow篇》 目录 一、基础 1....常见的场景有: 耗时操作:使用 withContext 切换到指定的 IO 线程去进行网络或者数据库请求。 等待操作:使用delay方法去等待某个事件。...我将会在下一篇文章中和大家讨论的原理,欢迎大家关注。 学习kotlin 还是很有必要的,我们团队在开发新的功能的时候,也全部选择了 Kotlin。...参考文章: “《最全面的Kotlin: Coroutine/Channel/Flow 以及实际应用》 《Kotlin中文站》 《Kotlin用力瞥一眼》

1.5K20

是继续Rxjava还是该试试Kotlin

0.前言 以前一直是Kotlin作为实验性的一个库,前些日子发现1.3版本的kotlin relese了,所以就找时间研究了一下,本来早就想写这篇文章了,但是因为离职换工作的原因,迟迟未能动笔,...子程序调用总是一个入口,一次返回,调用顺序是明确的。而的调用和子程序不同。看上去也是子程序,但执行过程中,在子程序内部可中断,然后转而执行别的子程序,在适当的时候再返回来接着执行。...当你的程序大部分是文件读写操作或者网络请求操作的时候,这时你应该首选而不是多线程,首先这些操作大部分不是利用cpu进行计算而是等待数据的读写,其次因为执行效率较高,子程序切换不是线程切换,是由程序自身控制...2.简单用法 这里我打算模仿一个网络请求,点击button发送网络请求,显示一个progressbar打转,返回结果后一个textview显示结果并隐藏progressbar 先看一下布局文件      ...-1线程,这里为什么使用async而没有使用launch,是因为async会返回一个Deferred对象,调用其await方法可以阻塞执行流等到执行完毕返回结果,这样可以得到一个返回值,在这个async

3.7K10
领券