Android 使用kotlin Retrofit2 + Dagger2完成网络请求跟依赖注入组合使用

文章目录

    • (一)引入依赖
    • (二)基本概念
      • Dagger中的基本概念:
      • Retrofit介绍
    • (三)Dagger2 @Module 和 @Provides 和 @Component +@Inject
    • (四)Retrofit2 创建数据类Bean跟Service服务
    • (五)使用Retrofit跟Dagger2

(一)引入依赖

implementation 'com.google.dagger:dagger:2.21'
kapt 'com.google.dagger:dagger-compiler:2.21'
implementation 'com.squareup.retrofit2:retrofit:2.0.2'
implementation("com.squareup.retrofit2:converter-gson:2.3.0")

注: dagger-compiler要使用kapt插件

plugins {id 'org.jetbrains.kotlin.kapt'
}

(二)基本概念

Dagger中的基本概念:

  • Provides提供依赖的方法撒谎给你添加的注解,provide方法需要包含在Module中
  • Module专门提供依赖,类似工厂模式
  • Component它是一个桥梁,一端是目标类,另一端是目标所依赖的实例,它也是注入器,负责把目标类所依赖类的实例注入到目标类中,同时它也管理Module。(先从Module中找依赖,再从Inject找构造函数)
  • Scope自定义注解,用于标示作用域,随意命名,对应即可
  • Inject是用来标注依赖和被依赖的构造函数

Retrofit介绍

Retrofit介绍:
它是一个RESTful的HTTP网络请求框架(基于OkHttp),它基于OkHttp,通过注解配置网络请求参数,能够支持多种数据的解析和序列化,如Gson、Json、XML、Protobuf
优点:

  • 功能强大,支持同步 & 异步、支持多种数据的解析 & 序列化格式、支持RxJava
  • 简洁易用:通过注解配置网络请求参数,采用大量设计模式简化使用
  • 可扩展性好:功能模块高度封装、解耦彻底

在这里插入图片描述

(三)Dagger2 @Module 和 @Provides 和 @Component +@Inject

定义Module类跟Component抽象接口

@Module
class NetworkModule {@Providesfun getRetrofit(): Retrofit? {return Retrofit.Builder().addConverterFactory(GsonConverterFactory.create()).baseUrl(BASE_URL).build()}companion object {const val BASE_URL = "http://api.k780.com/"}
}@Component(modules = [NetworkModule::class])
interface MyComponent {fun inject(regesiteActivity: RegesiteActivity)
}

在活动Activity中定义一个retrofit变量,标注@Inject注解表明这是需要被注入的变量,注意不要定义成val不可变类型

    @Injectlateinit var retrofit: Retrofit

然后在活动中进行注入,需要在View创建之后使用,DaggerMyComponent会在构建rebuild之后生成

DaggerMyComponent.create().inject(this)

在这里插入图片描述
如果依赖正确但是没有生成,检查下依赖是否正确,或者在gradle.properties中添加一行配置:

kapt.incremental.apt = false

(四)Retrofit2 创建数据类Bean跟Service服务

public interface Service {@GET("?app=weather.today&weaid=成都&appkey=46951&sign=b2f1992fc55dfd5ae70895f60ab3a86d&format=json")Call<FeatureBean> getFeatureBean();@GET("?")Call<FeatureBean> getFeature(@Query("app") String app, @Query("weaid") String city,@Query("appkey") String key, @Query("sign") String sign,@Query("format") String format);
}public class FeatureBean {private String success;private Result result;public void setSuccess(String success) {this.success = success;}public String getSuccess() {return success;}public void setResult(Result result) {this.result = result;}public Result getResult() {return result;}}public class Result {private String weaid;private String days;private String week;private String cityno;private String citynm;private String cityid;private String temperature;private String temperature_curr;private String humidity;private String aqi;private String weather;private String weather_curr;private String weather_icon;private String weather_icon1;private String wind;private String winp;private String temp_high;private String temp_low;private String temp_curr;private String humi_high;private String humi_low;private String weatid;private String weatid1;private String windid;private String winpid;private String weather_iconid;public void setWeaid(String weaid) {this.weaid = weaid;}public String getWeaid() {return weaid;}public void setWeek(String week) {this.week = week;}public String getWeek() {return week;}public String getDays() {return days;}public void setDays(String days) {this.days = days;}public void setHumidity(String humidity) {this.humidity = humidity;}public void setCityno(String cityno) {this.cityno = cityno;}public String getCityno() {return cityno;}public void setCitynm(String citynm) {this.citynm = citynm;}public String getCitynm() {return citynm;}public void setCityid(String cityid) {this.cityid = cityid;}public String getCityid() {return cityid;}public void setTemperature(String temperature) {this.temperature = temperature;}public String getTemperature() {return temperature;}public void setTemperature_curr(String temperature_curr) {this.temperature_curr = temperature_curr;}public String getTemperature_curr() {return temperature_curr;}public void setAqi(String aqi) {this.aqi = aqi;}public String getAqi() {return aqi;}public void setWeather(String weather) {this.weather = weather;}public String getWeather() {return weather;}public void setWeather_curr(String weather_curr) {this.weather_curr = weather_curr;}public String getWeather_curr() {return weather_curr;}public void setWeather_icon(String weather_icon) {this.weather_icon = weather_icon;}public String getWeather_icon() {return weather_icon;}public void setWeather_icon1(String weather_icon1) {this.weather_icon1 = weather_icon1;}public String getWeather_icon1() {return weather_icon1;}public void setWind(String wind) {this.wind = wind;}public String getWind() {return wind;}public void setWinp(String winp) {this.winp = winp;}public String getWinp() {return winp;}public void setTemp_high(String temp_high) {this.temp_high = temp_high;}public String getTemp_high() {return temp_high;}public void setTemp_low(String temp_low) {this.temp_low = temp_low;}public String getTemp_low() {return temp_low;}public void setTemp_curr(String temp_curr) {this.temp_curr = temp_curr;}public String getTemp_curr() {return temp_curr;}public void setHumi_high(String humi_high) {this.humi_high = humi_high;}public String getHumi_high() {return humi_high;}public void setHumi_low(String humi_low) {this.humi_low = humi_low;}public String getHumi_low() {return humi_low;}public void setWeatid(String weatid) {this.weatid = weatid;}public String getWeatid() {return weatid;}public void setWeatid1(String weatid1) {this.weatid1 = weatid1;}public String getWeatid1() {return weatid1;}public void setWindid(String windid) {this.windid = windid;}public String getWindid() {return windid;}public void setWinpid(String winpid) {this.winpid = winpid;}public String getWinpid() {return winpid;}public void setWeather_iconid(String weather_iconid) {this.weather_iconid = weather_iconid;}public String getWeather_iconid() {return weather_iconid;}@Overridepublic String toString() {return "Result{" +"weaid='" + weaid + '\'' +", days='" + days + '\'' +", week='" + week + '\'' +", cityno='" + cityno + '\'' +", citynm='" + citynm + '\'' +", cityid='" + cityid + '\'' +", temperature='" + temperature + '\'' +", temperature_curr='" + temperature_curr + '\'' +", humidity='" + humidity + '\'' +", aqi='" + aqi + '\'' +", weather='" + weather + '\'' +", weather_curr='" + weather_curr + '\'' +", weather_icon='" + weather_icon + '\'' +", weather_icon1='" + weather_icon1 + '\'' +", wind='" + wind + '\'' +", winp='" + winp + '\'' +", temp_high='" + temp_high + '\'' +", temp_low='" + temp_low + '\'' +", temp_curr='" + temp_curr + '\'' +", humi_high='" + humi_high + '\'' +", humi_low='" + humi_low + '\'' +", weatid='" + weatid + '\'' +", weatid1='" + weatid1 + '\'' +", windid='" + windid + '\'' +", winpid='" + winpid + '\'' +", weather_iconid='" + weather_iconid + '\'' +'}';}
}

(五)使用Retrofit跟Dagger2

没有注入的话需要先进行注入:

DaggerMyComponent.create().inject(this)
val callback  = retrofit.create(Service::class.java).getFeature("weather.today", "成都", "46951", "b2f1992fc55dfd5ae70895f60ab3a86d", "json")
val execute : Response<FeatureBean>? = callback?.execute()
val featureBean = execute?.body()
val result = featureBean?.result
println("返回结果:" + result?.toString())

注意:
(1)Unresolved reference: DaggerMyComponent
解决:在gradle.properties中添加

kapt.incremental.apt = false

(2)Kotlin 使用 Retrofit 报 Unresolved reference: GsonConverterFactory

原因是依赖有问题,converter-gson不适用kapt,修改成正确的依赖即可:

implementation 'com.squareup.retrofit2:retrofit:2.0.2'
implementation("com.squareup.retrofit2:converter-gson:2.3.0")

(3)IllegalArgumentException: Unable to create converter for class com.example.weatherapp.network.FeatureBean for method Service.getFeature

出现这个问题的原因是因为缺少ConverterFactory,所以要addConverterFactory

Retrofit.Builder().addConverterFactory(GsonConverterFactory.create())//这一行.baseUrl(BASE_URL).build()

参考文档:
https://blog.csdn.net/rjgcszlc/article/details/78364689
https://zhuanlan.zhihu.com/p/595569731
https://www.jianshu.com/p/f79003a5e6ba
https://blog.csdn.net/lu202032/article/details/129217818

好了,到这就写完了,更新不易,还望老铁们点个追更

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

wpf listbox实现选中动画

效果如下&#xff1a; 参考&#xff1a;https://github.com/WPFDevelopersOrg/WPFDevelopers/blob/master/src/WPFDevelopers.Samples.Shared/Controls/NavigateMenu/NavigateMenu.xaml 实现上述效果的前台代码&#xff1a; <Windowx:Class"ListBox.MainWindow"…

用户管理的小demo--查询

目录 1、先在数据库中 添加数据 2、servlet层 2.1 在servlet中 找到上一模块“LoginServlet.java”&#xff0c;在里面添加代码 2.2 在servlet层 new SelectUserServlet类 2.3 在web.xml 中&#xff0c;新增配置 3、service 层 4、 dao层 4.1 UserDao 4.2 UserDaoImpl…

ldap协议(常用于统一身份认证)与dict协议(在线词典)

文章目录 LDAPDICT LDAP LDAP&#xff08;Light Directory Access Portocol&#xff09;&#xff0c;轻量目录访问协议。 目录是一个为查询、浏览和搜索而优化的数据库&#xff0c;它成树状结构组织数据&#xff0c;类似文件目录一样。 目录数据库和关系数据库不同&#xff0c…

AI早班车6.3

1.蚂蚁技术日&#xff1a;支付宝三大「AI 管家」亮相。 2.百度赵世奇&#xff1a;百度搜索&#xff0b;文心智能体平台&#xff0c;助力智能体人人可用。 3.腾讯&#xff1a;发布大模型App腾讯元宝。 4.AFAC2024金融智能创新大赛启动&#xff0c;让高质量金融服务人人可用 …

Flutter开发效率提升1000%,Flutter Quick教程之定义Api(二)

如何定义一个Api Request。其他的地方依照常规填写就行&#xff0c;讲一讲需要注意的地方。 1,Headers 当tab是headers的时候&#xff0c;点击下面的加号按钮&#xff0c;会弹出 输入框下面有提示输入Headers的规则&#xff0c;即以分号隔开。比如 content-type:application…

超大功率光伏并网逆变器学习(三相) 一

1.超大功率用的IGBT开关频率通常很低,比如6KHz 2.线电压和相电压的关系 相电压 A AB线电压-CA线电压 相电压 B BC线电压-AB线电压 相电压 C CA线电压-BC线电压 3.坐标变换 ABC三相信号通过Clark坐标变换得到αβ两相静止信号,其中α与A相重合,β与α…

文件访问被拒绝,原来可以这样处理!

在使用电脑的过程中&#xff0c;我们有时会遇到无法访问某些文件的情况&#xff0c;通常会看到“文件访问被拒绝”的错误提示。这种情况可能是由于文件权限设置问题、文件正在被其他程序使用、系统错误或者病毒感染等原因引起的。本文将介绍三种解决文件访问被拒绝问题的方法&a…

深度学习创新点不大但有效果,可以发论文吗?

深度学习中创新点比较小&#xff0c;但有效果&#xff0c;可以发论文吗&#xff1f;当然可以发&#xff0c;但如果想让编辑和审稿人眼前一亮&#xff0c;投中更高区位的论文&#xff0c;写作永远都是重要的。 那么怎样“讲故事”才能让论文更有吸引力&#xff1f;我总结了三点…

JVM学习-字节码指令集(三)

代码下载 操作数栈管理指令 如同操作一个普通数据结构中的堆栈那样&#xff0c;JVM提供的操作数栈管理指令&#xff0c;可以用于直接操作数栈的指令 将一个或两个元素从栈顶弹出&#xff0c;并且直接废弃&#xff1a;pop,pop2复制栈顶一个或两个数值并将复制值成双份的复制值…

半导体光子电学期末笔记1: 电磁光学基本理论

Chapter 2: 电磁光学基本理论 电磁光学理论概述 真空中麦克斯韦方程组[p9] 在自由空间中&#xff0c;麦克斯韦方程组可以写成如下形式&#xff1a; { ∇ H ϵ 0 ∂ E ∂ t (1) ∇ E − μ 0 ∂ H ∂ t (2) ∇ ⋅ E 0 (3) ∇ ⋅ H 0 (4) \begin{cases} \nabla \times \…

Dubbo调用流程与启动流程

Dubbo调用流程与启动流程技术文档 一、概述 Dubbo是一个高性能、轻量级的开源服务框架&#xff0c;用于开发高性能微服务应用。它主要提供了三大核心功能&#xff1a;服务治理、远程调用和集群容错。本文档将详细介绍Dubbo的调用流程和启动流程。 二、Dubbo调用流程 2.1 服务…

SD NAND、SD卡和NOR Flash的区别

存储技术在现代电子设备中的应用越来越广泛&#xff0c;三种常见的存储解决方案是SD卡、SD NAND和NOR Flash。了解它们之间的区别&#xff0c;有助于选择合适的存储介质以满足特定的应用需求。 SD卡 1.接口和传输速度:SD卡&#xff08;Secure Digital Card&#xff09;是一种广…

迅狐短剧小程序源码:打造个性化的追剧体验

随着移动互联网的普及&#xff0c;短剧小程序源码的开发成为了影视爱好者的新宠。它不仅为用户提供了便捷的追剧体验&#xff0c;还通过推荐系统、观看历史、个性化喜好等特色功能&#xff0c;满足了用户的多样化需求。本文将深入探讨短剧小程序源码的特点、优势以及如何实现多…

fly-barrage 前端弹幕库(6):实现人像免遮挡

项目官网地址&#xff1a;https://fly-barrage.netlify.app/&#xff1b; &#x1f451;&#x1f40b;&#x1f389;如果感觉项目还不错的话&#xff0c;还请点下 star &#x1f31f;&#x1f31f;&#x1f31f;。 Gitee&#xff1a;https://gitee.com/fei_fei27/fly-barrage&a…

(文章复现)基于主从博弈的售电商多元零售套餐设计与多级市场购电策略

参考文献&#xff1a; [1]潘虹锦,高红均,杨艳红,等.基于主从博弈的售电商多元零售套餐设计与多级市场购电策略[J].中国电机工程学报,2022,42(13):4785-4800. 1.摘要 随着电力市场改革的发展&#xff0c;如何制定吸引用户选择的多类型零售套餐成为提升售电商利润的研究重点。为…

【TB作品】MSP430F5529,单片机,打地鼠游戏

功能 针对这块开发板做了一个打地鼠游戏&#xff1a; 1 给单片机上电后&#xff0c;初始化显示界面&#xff0c;显示出分数和等级。 2 游戏是一轮一轮进行的&#xff0c;每一轮会以50%几率点亮板子上的五个小灯&#xff0c;表示地鼠露头需要打了。 3 一轮游戏开始后&#xff…

最难沟通的,是那些一脸正确的人!寻找那上等的螃蟹!——早读(逆天打工人爬取热门微信文章解读)

端午节的代表&#xff1a;粽子 引言Python 代码第一篇 最难沟通的&#xff0c;是那些一脸正确的人第二篇结尾 路漫漫其修远兮&#xff0c;吾将上下而求索 ——屈原 引言 端午节 马上就要到了 大家有吃粽子的习俗吗&#xff1f; 我们潮汕那边就有 不过基本都是肉粽 去年还是前…

【Qt知识】Qt窗口坐标系

Qt的窗口坐标体系遵循标准的计算机图形坐标系统规则 Qt窗口坐标体系特点 坐标原点&#xff1a;窗口坐标体系的原点位于窗口的左上角&#xff0c;即坐标(0, 0)位置。 轴方向&#xff1a; X轴&#xff1a;向右为正方向&#xff0c;随着X坐标值的增加&#xff0c;元素在窗口中从…

Maven项目通过maven central 发布到中央仓库 https://repo.maven.apache.org/ 手把手教学 最新教学

一、注册maven central账号 ​ https://central.sonatype.com/publishing/namespaces 我这里直接使用github账号登录 &#xff0c;可以自己注册或者直接使用google账号或者github账号登录 这里github账号登录之后 应该只出现io.github 下面的io.gitee我也验证过 所以这里出…

UTONMOS:元宇宙游戏,散发无尽魅力与可能

在数字世界的浩瀚星海中&#xff0c;utonmos元宇宙游戏宛如一颗璀璨的明珠&#xff0c;散发着无尽的魅力与可能。 utonmos可不单单只是一款游戏&#xff0c;它更是一个令人惊叹的全新虚拟宇宙&#xff0c;急切地等待着你去深入探索和豪迈征服。 在这里&#xff0c;你能随心所欲…