Retrofit使用Kotlin协程发送请求
Retrofit2.6开始增加了对Kotlin协程的支持,可以通过suspend函数进行异步调用。本文简单介绍一下Retrofit中协程的使用
导入依赖
app的build文件中加入:
implementation 'com.squareup.retrofit2:retrofit:2.9.0'
implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
- 注意依赖版本
data class
data class ResultData<T>(
val code: Int,
val message: String,
val data: T
)
Retrofit实例
/**
* 创建Retrofit提供API Service
*/
object RetrofitClient {
const val BASE_URL = "http://192.168.2.194:8080/" // http://localhost:8080/
val okHttpClient = OkHttpClient.Builder()
.callTimeout(30, TimeUnit.SECONDS)
.build()
val retrofit = Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.client(okHttpClient)
.build()
val articleService = retrofit.create(ArticleService::class.java)
}
Service
interface ArticleService {
@GET("article/get/{id}")
suspend fun getArticleById(@Path("id") id: Long): ResultData<Article>
}
- 注意,请求路径前不加
/
,因为BASE_URL
中已经加了
在ViewModel中使用
class ArticleViewModel : ViewModel() {
val article by lazy {
MutableLiveData<Article>()
}
fun getArticle(id: Long) {
viewModelScope.launch {
val article = RetrofitClient.articleService.getArticleById(id)
contentList.value = articleList.data
Log.d("ViewPagerViewModel", "getArticle: $article")
}
}
}
ViewModelScope
为了调用suspend方法,需要提供一个CoroutineScope,如果实在ViewModel中进行api请求,可以像实例中那样使用ktx提供的viewModelScope,viewModelScope可以帮助我们在viewModel的onCleared时自动进行job的cancel,否则需要在手动cancel。
不在ViewModel中使用,例如在Activity中使用时,可以如下调用
CoroutineScope(Dispatchers.Main).launch {
// ...
}
不使用协程
Service
interface ArticleService {
@GET("article/get/{id}")
fun getArticleById(@Path("id") id: Long): Call<Article>
}
返回Call类型结果,通过enqueue插入队列等待回调处理
fun getArticle(id: Long) {
private val api = RetrofitClient.articleService
api.getArticleById().enqueue(object : Callback<Article> {
override fun onResponse(call: Call<Article>, response: Response<Article>) {
// 成功逻辑
}
override fun onFailure(call: Call<Article>, t: Throwable) {
// 失败逻辑
}
})
}
使用
Retrofit使用Kotlin协程发送请求的更多相关文章
- Android Kotlin协程入门
Android官方推荐使用协程来处理异步问题.以下是协程的特点: 轻量:单个线程上可运行多个协程.协程支持挂起,不会使正在运行协程的线程阻塞.挂起比阻塞节省内存,且支持多个并行操作. 内存泄漏更少:使 ...
- Kotlin 协程一 —— 全面了解 Kotlin 协程
一.协程的一些前置知识 1.1 进程和线程 1.1.1基本定义 1.1.2为什么要有线程 1.1.3 进程与线程的区别 1.2 协作式与抢占式 1.2.1 协作式 1.2.2 抢占式 1.3 协程 二 ...
- rxjava回调地狱-kotlin协程来帮忙
本文探讨的是在tomcat服务端接口编程中, 异步servlet场景下( 参考我另外一个文章),用rxjava来改造接口为全流程异步方式 好处不用说 tomcat的worker线程利用率大幅提高,接口 ...
- Kotlin协程解析系列(上):协程调度与挂起
vivo 互联网客户端团队- Ruan Wen 本文是Kotlin协程解析系列文章的开篇,主要介绍Kotlin协程的创建.协程调度与协程挂起相关的内容 一.协程引入 Kotlin 中引入 Corout ...
- Kotlin协程第一个示例剖析及Kotlin线程使用技巧
Kotlin协程第一个示例剖析: 上一次https://www.cnblogs.com/webor2006/p/11712521.html已经对Kotlin中的协程有了理论化的了解了,这次则用代码来直 ...
- Kotlin协程基础
开发环境 IntelliJ IDEA 2021.2.2 (Community Edition) Kotlin: 212-1.5.10-release-IJ5284.40 我们已经通过第一个例子学会了启 ...
- Kotlin协程通信机制: Channel
Coroutines Channels Java中的多线程通信, 总会涉及到共享状态(shared mutable state)的读写, 有同步, 死锁等问题要处理. 协程中的Channel用于协程间 ...
- Kotlin协程作用域与Job详解
Job详解: 在上一次https://www.cnblogs.com/webor2006/p/11725866.html中抛出了一个问题: 所以咱们将delay去掉,需要改造一下,先把主线程的dela ...
- Kotlin协程作用域与构建器详解
在上次我们是通过了这种方式来创建了一个协程: 接着再来看另一种创建协程的方式: 下面用它来实现上一次程序一样的效果,先来回顾一下上一次程序的代码: 好,下面改用runBlocking的方式: 运行一下 ...
随机推荐
- OSI七层模型与TCP/IP五层模型-(转自钛白Logic)
OSI七层模型与TCP/IP五层模型 博主是搞是个FPGA的,一直没有真正的研究过以太网相关的技术,现在终于能静下心学习一下,希望自己能更深入的掌握这项最基本的通信接口技术.下面就开始 ...
- git push 时发生错误 error: src refspec master does not match any. error: failed to push some refs to
很多相关解决办法都是最后要 push 到远端的 master 上,但很多其实要求不能把个人的修改内容直接 push 到 master 主分支. 因此,当我想将本地 feature/work1 分支的修 ...
- tkinter是内置的模块,不同的版本的导入形式不同,现总结如下
#coding=utf-8 import os, sys try: from tkinter import * except ImportError: #Python 2.x PythonVersio ...
- Java | Stream流、泛型、多线程 | 整理自用
1.lambda 表达式 lambda 的延迟执行 可以对程序进行优化,尤其是使用 if {} else {} 条件判断,先判断条件是否成立,再传入计算好的参数. functionName( para ...
- SQL Server将同一列多条数据合并成一行
Sql server中,将同一字段多条数据用字符拼接为一个字符串方式. 原数据查询展示: 使用 STUFF 函数,将结果列拼接成一行.结果如下: STUFF: 1.作用 stuff(param1, s ...
- 永远的Ace 实验四 团队作业1:软件研发团队组建
项目 内容 课程班级博客链接 https://edu.cnblogs.com/campus/xbsf/2018CST/ 这个作业要求链接 https://www.cnblogs.com/nwnu-da ...
- 并发编程-Condition
Condition 一个Lock中应该绑定一个Condition对象.Condition是Java提供用来实现等待/通知的类. 我们知道Object对象提供了wait.waitAll.notify.n ...
- 激光雷达数据到云cloud
激光雷达数据到云cloud 在美国地质调查局的3D提升计划(3DEP)被激发到一个新的方式可用性宣布从3DEP仓库的访问和处理激光雷达点云数据. 3DEP一直在美国使用光检测和测距(激光)技术获取三维 ...
- DMS是临时解决方案?
DMS是临时解决方案? Who Says DMS Is an Interim Solution? 现在是认真对待DMS驱动程序监控系统的时候了. 特斯拉(Tesla)在台湾高速公路上撞上翻倒卡车的镜头 ...
- KITTI数据集上MaskRCNN检测效果示例
KITTI数据集上MaskRCNN检测效果示例 在Semantic Instance Segmentation Evaluation中,MaskRCNN性能效果排名第一. Test Image 0 I ...