使用Kotlin协程配合Retrofit发送请求

Retrofit2.6开始增加了对Kotlin协程的支持,可以通过suspend函数进行异步调用。本文简单介绍一下使用Kotlin协程配合Retrofit使用,发起网络请求。

app的build文件中加入:

implementation 'com.squareup.retrofit2:retrofit:2.9.0'
implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1'
  • 注意依赖版本
data class ResultData(
    val code: Int,
    val message: String,
    val data: T
)
/**
 * 创建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)

}
interface ArticleService {
    @GET("article/get/{id}")
    suspend fun getArticleById(@Path("id") id: Long): ResultData
}

  • 注意,请求路径前不加 /,因为 BASE_URL中已经加了
class ArticleViewModel : ViewModel() {

    val article by lazy {
        MutableLiveData()
    }

    fun getArticle(id: Long) {
        viewModelScope.launch {
            val article = RetrofitClient.articleService.getArticleById(id)
            contentList.value = articleList.data
            Log.d("ViewPagerViewModel", "getArticle: $article")
        }
    }
}

为了调用suspend方法,需要提供一个CoroutineScope,如果实在ViewModel中进行api请求,可以像实例中那样使用ktx提供的viewModelScope,viewModelScope可以帮助我们在viewModel的onCleared时自动进行job的cancel,否则需要在手动cancel。

不在ViewModel中使用,例如在Activity中使用时,可以如下调用

CoroutineScope(Dispatchers.Main).launch {
   // ...

}

不使用协程

interface ArticleService {
    @GET("article/get/{id}")
    fun getArticleById(@Path("id") id: Long): Call
}

返回Call类型结果,通过enqueue插入队列等待回调处理

fun getArticle(id: Long) {
    private val api = RetrofitClient.articleService
    api.getArticleById().enqueue(object : Callback {
        override fun onResponse(call: Call, response: Response) {
            // 成功逻辑
        }
        override fun onFailure(call: Call, t: Throwable) {
            // 失败逻辑
        }
    })
}

Original: https://www.cnblogs.com/sw-code/p/14451921.html
Author: sw-code
Title: 使用Kotlin协程配合Retrofit发送请求

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/585596/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Java秒杀系统三:web层

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Linux 2023年6月11日
    098
  • Redis (error) NOAUTH Authentication required.

    首先查看redis设置密码没 表示没有设置密码,设置redis密码 这个时候查看密码是会报错的。 需要noauth身份验证。 修改密码 Original: https://www….

    Linux 2023年5月28日
    0100
  • 操作系统实现-中断及任务调度

    博客网址:www.shicoder.top微信:18223081347欢迎加群聊天 :452380935 这一次我们来对内核进行完善,主要包括全局描述符的加载、任务调度、中断等 全…

    Linux 2023年6月13日
    086
  • Docker 安装 MySQL、Redis

    1 Docker 中安装 Redis 1.1 创建目录 在硬盘上创建 redis 的数据目录: mkdir -p /Users/yygnb/dockerMe/redis/data …

    Linux 2023年6月7日
    0102
  • UWP graphql-dotnet新版数据查询客户端的实现

    之前写过一篇文章 UWP GraphQL数据查询客户端的实现,这次的标题基本差不多,只不过微软这个graphql-dotnet repo从1.x升级到了3.x,跨度有点大。 如果你…

    Linux 2023年6月13日
    088
  • 使用Amazon Pinpoint对用户行为追踪

    1.前言 最近在做一个项目,我们的后台大数据团队需要了解用户在使用app的时候,都进行了哪些操作,在哪个页面都干了些什么,以及app日活和月活等等,各种数据。总之就是监控用户行为,…

    Linux 2023年6月13日
    0102
  • nginx 修改文件上传大小限制

    修改nginx的配置文件,添加client_max_body_size 字段 注:client_max_body_size必须要放在server下的server_name下,而不是…

    Linux 2023年6月8日
    097
  • hadoop分布式集群部署①

    Linux系统的安装和配置。(在VM虚拟机上) 一:安装虚拟机VMware Workstation 14 Pro 以上,虚拟机软件安装完成。 二:创建虚拟机。 三:安装CentOS…

    Linux 2023年6月13日
    089
  • spring boot实现不同生产环境下的文件配置

    spring boot项目开发时不同开发环境,打包生成不同的文件。(避免生产环境得到开发环境时的配置文件) 配置不同生产环境 本文适用于开发环境下需要打包项目至生产环境,避免开发环…

    Linux 2023年6月7日
    091
  • Docker镜像构建之docker commit

    我们可以通过公共仓库拉取形象,但有时公共仓库拉取的形象不符合我们的需求。虽然我们已经从繁琐的部署工作中解脱出来,但在实际开发中,我们可能希望镜像包含整个项目的完整环境,将打包的完整…

    Linux 2023年5月27日
    090
  • SpringBoot-Redis

    SpringBoot 整合 Redis SpringBoot-Redis 15.1 导入相关依赖 org.springframework.boot spring-boot-star…

    Linux 2023年6月14日
    092
  • 项目经验示例

    一,期中项目经验示例 1,根据现有结构部署工具(PXE+kickstart)2,结合应用系统需求定制部署模版3,制作系统优化等一键执行脚本4,自动化部署实施5,根据定制的优化内容对…

    Linux 2023年6月7日
    087
  • wget命令8种实用用法

    大家好,我是良许。 wget 是一个可以从网络上下载文件的免费实用程序,它的工作原理是从 Internet 上获取数据,并将其保存到本地文件中或显示在你的终端上。 这实际上也是大家…

    Linux 2023年5月27日
    073
  • NoteOfMySQL-09-存储过程与函数

    常用的SQL语句在执行时需要先编译,然后执行;而存储过程(Store Procedure)是经编译后存储在数据库中的SQL语句集,在数据库中创建和保存。 一、存储过程与函数的区别 …

    Linux 2023年6月14日
    068
  • VRRP配置即实验

    VRRP 概念: VRRP 全称是虚拟路由器冗余协议,它是一种容错协议。该协议通过把几台路由设备联合组成一台虚拟的路由设备,该虚拟路由器在本地局域网拥有唯一的一个虚拟ID和虚拟IP…

    Linux 2023年6月6日
    081
  • Weblogic页面应用查询oracle数据库后台报错或页面日期格式显示错误

    问题:在生产环境中有两台WEB服务器,分别为227和228,部署的应用代码都是每日同步的,两边完全一致,但是某些页面查询数据时,227无结果,并且后台报java数组越界的错误,而2…

    Linux 2023年6月14日
    091
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球