Retrofit+Hilt后端请求小项目3--Retrofit代码完善

news2024/10/7 4:23:10

目录

      • ApiConstants
      • 定义实体类
      • 定义 API 接口
      • 定义 Repository
      • 定义 ApiModule
      • 定义 Application
      • 定义 ViewModel

ApiConstants

这一块存放 API 常量,即后端服务器 BASE_URL,以及对应的后缀 URL

代码清单:data/api/ApiConstants.kt

object ApiConstants {
    // 根URL
    const val BASE_URL = "https://hp-api.onrender.com/api/"
    // 欲接到根URL后面的URL
    // 因为我们需要请求的接口为https://hp-api.onrender.com/api/characters,故我们这里把它们拆开来写
    const val END_POINTS = "characters"
}

定义实体类

还记得我们上一章添加的 JSON 转 kotlin 插件吗?

右击 module 文件夹,在弹出菜单选择 new->kotlin data class files from JSON
把上一节我们复制的 JSON 贴到编辑框里面

在这里插入图片描述

依次选择:advanced->annotation->moshi,然后点 OK

在这里插入图片描述

最后给 class name 填入咱们的实体类名字:Character,点击确定即可自动生成

此时我们会发现在 module 文件夹下生成了两个实体类 Character 和 Wand,实际上是因为 Character 类内有一个列表它包含了实体类 Wand,所以生成的时候自动变更了


现给出两个文件对应的最终代码:

Character.kt

// generateAdapter表示为数据类生成对应的适配器,便于moshi的类型转换!
@JsonClass(generateAdapter = true)
data class Character(
    // @Json注解可以定义响应体中的json属性名
    // 而变量名就是我们开发中使用的名称
    @Json(name = "actor")
    val actor: String,
    @Json(name = "alive")
    val alive: Boolean,
    @Json(name = "alternate_actors")
    val alternateActors: List<String>,
    @Json(name = "alternate_names")
    val alternateNames: List<String>,
    @Json(name = "ancestry")
    val ancestry: String,
    @Json(name = "eyeColour")
    val eyeColour: String,
    @Json(name = "gender")
    val gender: String,
    @Json(name = "hairColour")
    val hairColour: String,
    @Json(name = "hogwartsStaff")
    val hogwartsStaff: Boolean,
    @Json(name = "hogwartsStudent")
    val hogwartsStudent: Boolean,
    @Json(name = "house")
    val house: String,
    @Json(name = "id")
    val id: String,
    @Json(name = "image")
    val image: String,
    @Json(name = "name")
    val name: String,
    @Json(name = "patronus")
    val patronus: String,
    @Json(name = "species")
    val species: String,
    @Json(name = "wand")
    val wand: Wand,
    @Json(name = "wizard")
    val wizard: Boolean,
)

Wand.kt

@JsonClass(generateAdapter = true)
data class Wand(
    @Json(name = "core")
    val core: String,
    @Json(name = "wood")
    val wood: String
)

定义 API 接口

此即 retrofit 请求的 API 设置

api 接口类似于后端的 service 层

代码清单:data/api/CharacterApi.kt

interface CharacterApi {
    // @GET表示使用的请求方式
    // 由于设置好了BASE_URL,这里仅需附加后缀URL即可
    @GET(ApiConstants.END_POINTS)
    // 使用挂起函数,在协程作用域内调用,实现异步操作
    // 因为获取的是所有角色,故用List
    suspend fun getCharacter():List<Character>
}

定义 Repository

repository 类似于后端的 controller 层

代码清单:data/repository/CharacterRepo.kt

// @Inject constructor实现注入
class CharacterRepo @Inject constructor(
    private val characterApi: CharacterApi
) {
    // 直接调用API获取全部用户
    // 记得这个也是一个挂起函数
    suspend fun getCharacters(): List<Character> {
        return characterApi.getCharacter()
    }
}

定义 ApiModule

定义一个 hilt 模块 CharacterApiModule
该模块使用单例模式,故指定 @InstallIn 为 SingletonComponent

部分注解介绍:

  1. @Module 定义一个 hilt 模块
  2. @InstallIn 定义该模块的作用域
  3. @Provides 注入,效果等同于@Inject
  4. @Singleton 定义其为单例

代码清单:di/CharacterApiModule.kt

@Module
@InstallIn(SingletonComponent::class)
object CharacterApiModule {

    // 第一步:在这里使用扩展函数的方式定义Builder的基础信息并实例化
    // 这里定义了baseUrl以及转换器addConverterFactory
    @Provides
    @Singleton
    fun provideRetrofit(): Retrofit.Builder{
        return Retrofit.Builder()
            .baseUrl(ApiConstants.BASE_URL)
            .addConverterFactory(MoshiConverterFactory.create())
    }

    // 第二步:通过API构造对应retrofit实例
    // 确保其为单例,故添加@Singleton注解
    @Provides
    @Singleton
    fun provideApi(builder:Retrofit.Builder): CharacterApi{
        return builder
            .build()
            .create(CharacterApi::class.java)
    }
}

定义 Application

该文件被作者放到了根目录 com.example.character 之外了,这里建议大家选择合适的位置存放,不一定和作者的一致

代码清单:CharacterApplication.kt

@HiltAndroidApp
class CharacterApplication:Application() {
}

定义 ViewModel

由于 API 是挂起函数,故必须在协程作用域内执行
直接使用 viewmodel 自带的 viewModelScope 处理协程操作,即可异步修改状态,而无需在主页面中进行异步处理

代码清单:ui/home/HomeViewModel.kt

// @HiltViewModel注解为hilt框架专属
@HiltViewModel
// 记得注入
class HomeViewModel @Inject constructor(
    private val characterRepo: CharacterRepo
) : ViewModel() {

    // MutableStateFlow使用流来管理操作
    // emptyList空列表存放获取到的Character数据
    // 标准的一个私有一个公有的变量定义处理,这里就不多说了
    private val _state = MutableStateFlow(emptyList<Character>())
    val state: StateFlow<List<Character>>
        get() = _state

    // init初始化代码块内启动协程作用域,获取用户数据
    init {
        viewModelScope.launch {
            val characters = characterRepo.getCharacters()
            _state.value = characters
        }
    }
}

下一章将介绍页面 UI 的绘制以及如何取用 viewmodel 中内容

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/362987.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

最纯净-Ubuntu系统下如何卸载kubernetes(k8s)-2023最新

首先&#xff0c;如果是卸载k8s-1.24以上版本&#xff0c;需要单独卸载containerd&#xff1a; sudo apt-get purge --auto-remove containerd.io1. 步骤 其他步骤如下&#xff1a; 执行命令&#xff1a; kubeadm reset -fsudo apt-get purge --auto-remove kubernetes…

港科夜闻|广东省省长王伟中会见香港科技大学访问团

关注并星标每周阅读港科夜闻建立新视野 开启新思维1、广东省省长王伟中会见香港科技大学访问团。2月17日&#xff0c;广东省省长王伟中先生在广州与香港科大校董会主席廖长城先生、校董会副主席杨佳锠教授、校长叶玉如教授就加强教育合作、科技创新等进行深入交流。王伟中先生表…

华为OD机试 - 入栈出栈(C++) | 附带编码思路 【2023】

刷算法题之前必看 参加华为od机试,一定要注意不要完全背诵代码,需要理解之后模仿写出,通过率才会高。 华为 OD 清单查看地址:https://blog.csdn.net/hihell/category_12199283.html 华为OD详细说明:https://dream.blog.csdn.net/article/details/128980730 华为OD机试题…

特征与处理-sklearn归一化、标准化、缺失值处理

目录 特征的预处理 归一化 标准化 缺失值 特征的预处理 特征处理定义&#xff1a;通过特定的二统计方法&#xff08;数学方法&#xff09;将数据转换成算法要求的数据 归一化 sklearn归一化API&#xff1a;sklearn.preprocessing.MinMaxScaler from sklearn.preprocessing i…

【Selenium学习】Selenium 总结

1.Selenium 简介Selenium 经历了三个大版本&#xff0c;Selenium 1.0、Selenium 2.0 和 Selenium 3.0。Selenium 不是由单独一个工具构成的&#xff0c;而是由一些插件和类库组成的&#xff0c;这些插件和类库有其各自的特点和应用场景。Selenium 1.0 家族关系如下图所示。1.1 …

华为OD机试 - 数组排序(C++) | 附带编码思路 【2023】

刷算法题之前必看 参加华为od机试,一定要注意不要完全背诵代码,需要理解之后模仿写出,通过率才会高。 华为 OD 清单查看地址:https://blog.csdn.net/hihell/category_12199283.html 华为OD详细说明:https://dream.blog.csdn.net/article/details/128980730 华为OD机试题…

我说我为什么抽不到SSR,原来是这段代码在作祟...

本文是龚国玮所写&#xff0c;熊哥有所新增修改删减&#xff0c;原文见文末。 我说我为什么抽不到SSR&#xff0c;原来是加权随机算法在作祟 阅读本文需要做好心理准备&#xff0c;建议带着深究到底的决心和毅力进行学习&#xff01; 灵魂拷问 为什么有 50% 的几率获得金币&a…

【数据结构】顺序表和链表的区别和联系(详解)

顺序表和链表的区别&#xff08;详解&#xff09; 文章目录顺序表和链表的区别&#xff08;详解&#xff09;前言一、顺序表和链表的关系二、顺序表1.优点2.缺点三、链表1.优点2.缺点四、区别表格总结前言 本文给大家介绍顺序表和链表的各自的优缺点和区别与联系&#xff0c;结…

华为OD机试 - 事件推送(C++) | 附带编码思路 【2023】

刷算法题之前必看 参加华为od机试,一定要注意不要完全背诵代码,需要理解之后模仿写出,通过率才会高。 华为 OD 清单查看地址:https://blog.csdn.net/hihell/category_12199283.html 华为OD详细说明:https://dream.blog.csdn.net/article/details/128980730 华为OD机试题…

20230222 【梳理】肿瘤检测 预处理+ML+DL

一、预处理 1、形态学【使图像中的重要部分更加可见,并消除MRI图像的琐碎部分。】 形态学操作是一种非线性操作,涉及在二值图像上移动一个窗口(或结构元素),以一种方式帮助增长图像(膨胀)或缩小图像(侵蚀)[30]。这种预处理技术更有用,特别是当MRI图像中存在不需要

基于计算机视觉的智慧养老系统

基于计算机视觉的智慧养老系统 Intelligent elderly care system based on computer vision 基于计算机视觉的智慧养老系统通过&#xff08;模拟&#xff09;多组摄像头实时拍摄到的画面&#xff0c;用计算机视觉技术实时分析老人的情感、是否有人摔倒、是否有人闯入禁止区域…

我的 System Verilog 学习记录(2)

引言 从本文开始&#xff0c;就开始系统学习 System Verilog &#xff0c;不只是语法&#xff0c;还有结合 Questa Sim 的实际编程练习、Debug。 本文简单介绍 System Verilog 语言的用途以及学习的必要性。 前文链接&#xff1a; 我的 System Verilog 学习记录&#xff08…

C#从值类型、引用类型到装箱和拆箱

上一篇文章讲了C#的值类型和引用类型&#xff0c;这里再来看看值类型和引用类型最直接的使用场景&#xff1a;装箱和拆箱。 一、基本概念 装箱&#xff1a;值类型转化为引用类型的过程。从托管堆中为新生成的引用类型对象分配内存,再把值类型的实例字段拷贝到托管堆上新对象的…

面向对象的三大特征

面向对象&#xff08;OOP&#xff09;的三大特征&#xff1a;继承、封装、多态 一、封装性 为什么需要封装&#xff1f;封装的作用和含义&#xff1f; 我要用洗衣机&#xff0c;只需要按一下开关和洗涤模式就可以了。有必要了解洗衣机内 部的结构吗&#xff1f;有必要碰电动机…

C语言【atoi函数】

C语言【atoi函数】&#x1fac5;系统atoi函数&#x1fac5; 模拟实现atoi函数看到atoi函数&#xff0c;有人又会问有这个函数&#xff0c;我怎么没用过。那就说明&#xff1a;不是你刷题太少&#xff0c;就是atoi函数存在感太低。 这篇函数就带你领略atoi函数的魅力 &#x1fa…

APP测试中ios和androis的区别,有哪些注意点

目录 一、运行机制不同 二、对app内存消耗处理方式不同 三、后台制度不同 四、最高权限指令不同 五、推送机制不同 六、抓取方式不同 七、灰度发版机制不同 八、审核机制不同 总结感谢每一个认真阅读我文章的人&#xff01;&#xff01;&#xff01; 重点&#xff1a;…

Arduino-流水灯

LED流水灯实验产品介绍&#xff1a;电阻&#xff1a;电阻器通常分为三类&#xff1a;固定电阻器、可调电阻器及特殊电阻器。普通电阻器的识别电阻器阻值和允许误差常用的标志方法有下列3种。1、直接标志法将电阻器的阻值和误差等级直接用数字印在电阻器上。对小于1000W的阻值只…

C语言进阶(五)—— 多维数组

1. 一维数组 元素类型角度&#xff1a;数组是相同类型的变量的有序集合内存角度&#xff1a;连续的一大片内存空间在讨论多维数组之前&#xff0c;我们还需要学习很多关于一维数组的知识。首先让我们学习一个概念。1.1 数组名考虑下面这些声明&#xff1a;int a; int b[10];我们…

6、Fatfs系统移植

注意&#xff1a;挂载Fatfs笔记 Fatfs系统读写文件的时间是不固定的&#xff0c;随机性 搭载Fatfs的外设通信方式建议开启DMA方式&#xff0c;否则应避免中断打断时序&#xff0c;导致Fatfs出现FR_DISK_ERR&#xff08;A hard error occurred in the low level disk I/O layer&…

金三银四丨黑蛋老师带你剖析-安全开发岗

作者丨黑蛋在之前呢&#xff0c;我们聊了二进制这块的病毒岗位&#xff0c;漏洞岗位&#xff0c;逆向岗位以及CTF这块的岗位。今天我们就来聊一聊安全开发类的工作岗位。首先网络安全方向中安全开发岗位都有哪些&#xff0c;安全开发主要指安全研发工程师或安全开发工程师&…