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 {
    @Provides
    fun 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不可变类型

    @Inject
    lateinit 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;
    }

    @Override
    public 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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

GIt快速入门(一文学会使用Git)

GIt快速入门 文章目录 GIt快速入门一、为什么要学习Git二、Git的安装1.安装Git2.下载GUI 三、Git的概念1、版本控制2、集中式控制3、分布式控制4、多人协作开发1.并行开发2.分支管理3.冲突解决4.代码审查5.分布式特性 四、Git客户端操作1.界面介绍2.提交操作3.创建分支4.合并分…

网络I/O模型

网络I/O模型 同步I/O阻塞I/O非阻塞I/OI/O多路复用select函数接口示例 poll函数接口示例 poll 和 select 的区别epoll原理&#xff1a;示例 异步I/O 同步I/O 阻塞I/O 一个基本的C/S模型如下图所图&#xff1a;其中 listen()、connect()、write()、read() 都是阻塞I/O&#xff0…

Java面试题:Redis2_解决Redis缓存击穿问题

缓存击穿 当一个key过期时,需要对这个key进行数据重建 在重建的时间内如果有大量的并发请求进入,就会绕过缓存进入数据库,会瞬间击垮DB 重建时间可能因为数据是多个表的混合结果需要分头统计而延长,从而更容易出现缓存击穿问题 缓存击穿的解决方案 添加互斥锁 先查询缓存…

电商商城管理系统

前言&#x1f440;~ 将近一个月没更新了&#xff0c;最近忙着学校的大作业&#xff0c;一个是微信小程序的、一个是互联网编程的&#xff0c;也是忙完了这个大作业&#xff0c;这个大作业前端使用了vue、后端使用了java&#xff0c;接下来展示一些效果图&#xff0c;如果有需要…

2024 第三届 AIGC 中国开发者大会:多模态大模型的发展与趋势

引言 在2024年第三届AIGC中国开发者大会上&#xff0c;零一万物联合创始人潘欣分享了多模态大模型的发展与趋势。潘欣对多模态大模型的历史、现状和未来进行了详细回顾和深刻思考&#xff0c;为我们揭示了该领域的发展路径和技术前景。本文将详细解读潘欣的分享内容&#xff0…

如何搜索[仅有1个文件]或[指定个数范围、名称、类型文件等复杂情况]的文件夹

首先&#xff0c;需要用到的这个工具&#xff1a; 度娘网盘 提取码&#xff1a;qwu2 蓝奏云 提取码&#xff1a;2r1z 打开工具&#xff0c;切换到批量复制板块&#xff0c;用Ctrl5可以快速切换 然后鼠标移动到工具的贴边的右侧&#xff0c;不是移出工具外面&#xff0c;还在…

RT_thread nano移植Finsh

参考连接: https://blog.csdn.net/baseball214/article/details/131341722 移植的前提是,你已经有一个可以使用的nano功能. 1.将rtthread-nano-master\rt-thread\components文件复制到工程. 2.添加Finsh中的.c以及相关.h头文件路径 3.注释掉finsh_config.h文件中以下两个宏…

颠仆流离学二叉树2 (Java篇)

本篇会加入个人的所谓鱼式疯言 ❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言 而是理解过并总结出来通俗易懂的大白话, 小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的. &#x1f92d;&#x1f92d;&#x1f92d;可能说的不是那么严谨.但小编初心是能让更多人…

使用autodl服务器进行模型训练

1.注册并且选择一个服务器租用 2.点击jupyter lab进入服务器内部 3.把yolov5-master这个的压缩文件上传到jupyter的文件列表中 4.打开终端 (1)查看目录 ls (2)解压yolov5-master(1) unzip "yolov5-master (1).zip" 可以看到解压成功&#xff01; (3)进入yolov5-m…

网桥、路由器和网关有什么区别

在计算机网络领域&#xff0c;网桥、路由器和网关都是常见的网络设备&#xff0c;它们在网络通信中扮演着不同的角色。虽然它们都有连接不同网络的功能&#xff0c;但在实际应用中却具有各自独特的作用和特点。 1.网桥&#xff08;Bridge&#xff09; 定义&#xff1a;网桥是…

【云原生】Kubernetes----配置资源管理Secrets与ConfigMaps

目录 一、Secrets &#xff08;一&#xff09;Secrets概述 &#xff08;二&#xff09;Secrets类型 &#xff08;三&#xff09;Secrets使用方式 &#xff08;四&#xff09;创建Secrets 1.陈述式命令创建 1.1 定义用户与密码文件 1.2 使用陈述式命令创建 2.使用base6…

每日一题《leetcode--LCR 022.环形链表||》

https://leetcode.cn/problems/c32eOV/ 我们使用两个指针&#xff0c;fast 与 slow。它们起始都位于链表的头部。随后slow 指针每次向后移动一个位置&#xff0c;而fast 指针向后移动两个位置。如果链表中存在环&#xff0c;则fast 指针最终将再次与slow 指针在环中相遇。 stru…

飞腾D2000+FPGA云终端,实现从硬件、操作系统到应用的完全国产、自主、可控

飞腾云终端基于国产化飞腾高性能8核D2000处理器平台的国产自主可控解决方案&#xff0c;搭载昆仑国产化固件,支持UOS、银河麒麟等国产操作系统&#xff0c;满足国产化信息安全运算的需求&#xff0c;实现从硬件、操作系统到应用的完全国产、自主、可控&#xff0c;是国产信息安…

排序进阶----快速排序

当我们写了插入和希尔排序后&#xff0c;我们就应该搞更难的了吧。大家看名字就知道我们这篇博客的内容了吧。而且从名字上来看。快速排序就很快吧。那么为什么这个排序怎么能叫快速排序啊。我们希尔排序不是很快嘛。那么我们的快速排序肯定是有特殊之处嘞。不然这就太自负了。…

【简单讲解下Fine-tuning BERT,什么是Fine-tuning BERT?】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

paddleocr快速入门:基于python脚本及命令行两种方式实现图片OCR识别

本篇将再讲讲paddleocr在图像OCR识别方面的应用。 一、paddlecor参数说明 字段说明默认值use_gpu是否使用GPUTRUEgpu_mem初始化占用的GPU内存大小8000Mimage_dir通过命令行调用时执行预测的图片或文件夹路径page_num当输入类型为pdf文件时有效&#xff0c;指定预测前面page_nu…

R语言ggplot2包绘制世界地图

数据和代码获取&#xff1a;请查看主页个人信息&#xff01;&#xff01;&#xff01; 1. 数据读取与处理 首先&#xff0c;从CSV文件中读取数据&#xff0c;并计算各国每日收入的平均签证成本。 library(tidyverse) ​ df <- read_csv("df.csv") %>% group_…

MAC帧

基本问题 数据链路层的协议有很多&#xff0c;但是都有三个基本问题&#xff1a;封装成帧&#xff0c;透明传输和差错检测。 封装成帧 封装成帧&#xff08;Framing&#xff09;就是在一段数据的前后分别添加首部和尾部&#xff0c;这样就构成了一个帧。帧是数据链路层的传送…

css 中clip 属性和替代方案 clip-path属性使用

clip clip 属性概述 作用&#xff1a;clip 属性用于定义一个裁剪区域&#xff0c;该区域外的元素内容将不可见。适用元素&#xff1a;clip 属性只对绝对定位&#xff08;position: absolute&#xff09;或固定定位&#xff08;position: fixed&#xff09;的元素有效&#xf…

掘金AI 商战宝典-高阶班:如何用AI制作视频(11节视频课)

课程目录&#xff1a; 1-第一讲用AI自动做视频&#xff08;上&#xff09;_1.mp4 2-第二讲用AI自动做视频&#xff08;中&#xff09;_1.mp4 3-第四讲A1做视频实战&#xff1a;店铺宣传_1.mp4 4-第五讲Al做视频实战&#xff1a;商品带贷1.mp4 5-第六讲Al做视频实战&#x…