Android---Retrofit实现网络请求:Java 版

简介

在 Android 开发中,网络请求是一个极为关键的部分。Retrofit 作为一个强大的网络请求库,能够简化开发流程,提供高效的网络请求能力。

Retrofit 是一个建立在 OkHttp 基础之上的网络请求库,能够将我们定义的 Java 接口转化为相应的 HTTP请求,Retrofit 是适用于 Android 和 Java 的类型安全 HTTP 客户端。通过Retrofit,我们可以轻松发起网络请求,还能将服务器返回的数据转换为所需的格式,如 JSON。

简单使用

1. 在 APP 目录下的 build.gradle 里添加依赖

    // retrofit
    // https://github.com/square/retrofit
    implementation("com.squareup.retrofit2:retrofit:2.9.0")
    // 适配 retrofit 使用 gson 解析
    // 版本要和 retrofit 一样
    implementation("com.squareup.retrofit2:converter-gson:2.9.0")
    // 使用 gson 解析 json
    // https://github.com/google/gson
    implementation("com.google.code.gson:gson:2.10.1")

2. 在 AndroidManifest.xml 里添加网络权限

<uses-permission android:name="android.permission.INTERNET"/>

3. NetworkModule.kt 创建 Retrofit 实例。单例创建Retrofit,并通过create() 方法返回一个 Service 实例。

public class NetworkModule {
    private static Retrofit newsRetrofit;

    private NetworkModule(){}

    public static <T> T getService(Class<T> newsService){
        if (newsRetrofit == null) {
            synchronized (NetworkModule.class){
                if (newsRetrofit == null) {
                    newsRetrofit = new Retrofit.Builder()
                            .baseUrl("http://v.juhe.cn/")
                            .addConverterFactory(GsonConverterFactory.create())
                            .build();
                }
            }
        }
        //TODO 通过 Retrofit 的 create() 方法返回一个传入 Service 的实例
        return newsRetrofit.create(newsService);
    }
}

getService(Class<T> newsService) 方法里,通过Retrofit.create() 方法,返回一个传入的 NewsService 的实例

4. NetworkService.kt 创建网络请求的 Service。是一个接口类

public interface NetworkService {
    @GET("toutiao/index")
    Call<NewsEntity> getNewsService(@Query("key") String key);
}

NewsEntity 是一个实体类,解析返回的数据。Result.java是一个具体的数据类,可根据返回的数据进行细化。

public class NewsEntity {

    private String reason;//返回说明, 成功为 success

    //private Result result;

    private int error_code;// 返回码

    public String getReason() {
        return reason;
    }

    public void setReason(String reason) {
        this.reason = reason;
    }

    public int getError_code() {
        return error_code;
    }

    public void setError_code(int error_code) {
        this.error_code = error_code;
    }
}

5. MainActivity.java 进行网络请求

public class MainActivity extends AppCompatActivity {

    private TextView networkRequest;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        networkRequest = findViewById(R.id.network_request);
        networkRequest.setOnClickListener(view -> {
            // 创建 NetworkService 的实例
            NetworkService networkService = NetworkModule.getService(NetworkService.class);
            networkService.getNewsService("40279bee66d427555ce361fe49387a8e").enqueue(new Callback<NewsEntity>() {
                @Override
                public void onResponse(Call<NewsEntity> call, Response<NewsEntity> response) {
                    // TODO 请求成功
                    Log.d("HL", response.body().getReason());
                }

                @Override
                public void onFailure(Call<NewsEntity> call, Throwable t) {
                    // TODO 请求失败
                }
            });
        });
    }

}

注意:网络请求是异步操作,应该放入子线程里执行。这里为了演示请求是否成功,就简单的在 UI 线程里进行。

请求的数据是聚合数据上的新闻头条API 接口,请求地址为: "http://v.juhe.cn/toutiao/index?key=40279bee66d427555ce361fe49387a8e"。由于是使用的 http 请求头,所以需要在 AndroidManifest.xml 里添加 android:usesCleartextTraffic="true",更改网络安全配置。

最后,通过打印 Log 的方式,查看请求是否成功。 现实结果为 success。

对应的 Java 版本实现:Android---Retrofit实现网络请求:Kotlin版 

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

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

相关文章

【Vue3】路由传参的几种方式

路由导航有两种方式&#xff0c;分别是&#xff1a;声明式导航 和 编程式导航 参数分为query参数和params参数两种 声明式导航 query参数 一、路径字符串拼接(不推荐) 1.传参 在路由路径后直接拼接?参数名:参数值 &#xff0c;多组参数间使用&分隔。 <RouterLink …

OpenGL学习——17.模型

前情提要&#xff1a;本文代码源自Github上的学习文档“LearnOpenGL”&#xff0c;我仅在源码的基础上加上中文注释。本文章不以该学习文档做任何商业盈利活动&#xff0c;一切著作权归原作者所有&#xff0c;本文仅供学习交流&#xff0c;如有侵权&#xff0c;请联系我删除。L…

算法——数值算法——牛顿迭代法

目录 牛顿迭代法 一、1021: [编程入门]迭代法求平方根 牛顿迭代法 迭代法&#xff08;Iteration&#xff09;是一种通过反复递推计算来逼近解的方法。而牛顿迭代法&#xff08;Newtons method&#xff09;则是一种特定的迭代法&#xff0c;用于求解方程或函数的根、最小值、最…

【软考中级备考笔记】计算机体系结构

计算机体系结构 2月19日 – 天气&#xff1a;阴转小雪 1. 冯诺依曼计算机体系结构 冯诺依曼将计算机分为了五大部分&#xff0c;分别是&#xff1a; 控制器&#xff1a;主要负责协调指令到执行运算器&#xff1a;负责算数和逻辑运算存储器&#xff1a;负责存储在指令执行过程…

Javaweb之SpringBootWeb案例之切入点表达式的详细解析

3.3 切入点表达式 从AOP的入门程序到现在&#xff0c;我们一直都在使用切入点表达式来描述切入点。下面我们就来详细的介绍一下切入点表达式的具体写法。 切入点表达式&#xff1a; 描述切入点方法的一种表达式 作用&#xff1a;主要用来决定项目中的哪些方法需要加入通知 …

SOPHON算能科技新版SDK环境配置以及C++ demo使用过程

目录 1 SDK大包下载 2 获取SDK中的库文件和头文件 2.1 注意事项 2.2 交叉编译环境搭建 2.2.1 首先安装工具链 2.2.2 解压sophon-img包里的libsophon_soc__aarch64.tar.gz&#xff0c;将lib和include的所有内容拷贝到soc-sdk文件夹 2.2.3 解压sophon-mw包里的sophon-mw-s…

【Simulink系列】——动态系统仿真 之 连续系统线性连续系统

声明&#xff1a;本系列博客参考有关专业书籍&#xff0c;截图均为自己实操&#xff0c;仅供交流学习&#xff01; 一、连续系统定义 连续系统输出在时间上连续变化&#xff0c;而非间隔采样取值&#xff0c;满足以下条件&#xff1a; ①输出连续变化&#xff0c;变化的间隔…

java中实体pojo对于布尔类型属性命名尽量别以is开头,否则 fastjson可能会导致属性读取不到

假如我们有一个场景&#xff0c;就是需要将一个对象以字符串的形式&#xff0c;也就是jsonString存到一个地方&#xff0c;比如mysql&#xff0c;或者redis的String结构。现在有一个实体&#xff0c;我们自己创建的&#xff0c;叫做CusPojo.java 有两个属性是布尔类型的&#x…

删除有序数组中的重复项 II

题目链接 删除有序数组中的重复项 II 题目描述 注意点 nums 已按升序排列1 < nums.length < 30000原地删除重复出现的元素&#xff0c;使得出现次数超过两次的元素只出现两次返回删除后数组的新长度 解答思路 因为数组是按升序排列的&#xff0c;可以使用将某个区间…

[C#]winform基于opencvsharp结合pairlie算法实现低光图像增强黑暗图片变亮变清晰

【低光图像增强介绍】 在图像处理领域&#xff0c;低光图像增强是一个具有挑战性的任务。由于光线不足&#xff0c;这些图像往往呈现出低对比度、高噪声和细节丢失等问题&#xff0c;严重影响了图像的视觉效果和后续分析的准确性。因此&#xff0c;开发有效的低光图像增强方法…

解锁文档处理新境界:ONLYOFFICE编辑功能为开发者带来新机遇

引言 ONLYOFFICE最新发布的文档8.0版本带来了一系列引人注目的功能和优化&#xff0c;为用户提供了更强大、更高效的在线编辑体验。这次更新涵盖了多个方面&#xff0c;包括PDF表单、RTL支持、单变量求解、图表向导以及插件界面设计更新等。这些新功能不仅提升了文档处理的便利…

关于投资,房地产,AI

各位朋友&#xff0c;新年好&#xff01; 过个年&#xff0c;世界发生了很多大事&#xff01; 投资 先是证监会&#xff0c;证监会年前换帅&#xff0c;吴清接棒&#xff0c;吴清何许人也&#xff1f;江湖人称“券商屠夫”&#xff0c;成功处置了2008年的券商风险&#xff0…

【Linux】Linux权限

Linux权限 Linux下用户的分类切换用户su 和 su - 的区别 对命令提权 权限的概念Linux权限管理文件访问者的分类&#xff08;人&#xff09;1️⃣拥有者u→user2️⃣其他人o→others3️⃣所属组group 文件类型和访问权限&#xff08;事物属性&#xff09;文件文件类型文件的基本…

单片机stm32智能鱼缸

随着我国经济的快速发展而给人们带来了富足的生活&#xff0c;也有越来越多的人们开始养鱼&#xff0c;通过养各种鱼类来美化居住环境和缓解压力。但是在鱼类饲养过程中&#xff0c;常常由于鱼类对水质、水位及光照强度有着很高的要求&#xff0c;而人们也由于工作的方面而无法…

齐次方程是否有非零解,和它的系数矩阵行列式的关系

视频来源&#xff1a;https://www.bilibili.com/video/BV1vY4y1J7gd/?spm_id_from333.337.search-card.all.click&vd_source7a1a0bc74158c6993c7355c5490fc600 4:22 有这么一句话&#xff0c;如下图 对于齐次方程&#xff0c;若系数矩阵的行列式为零&#xff0c;则方程…

vue-router钩子函数有哪些?都有哪些参数?

Vue.js是一款流行的JavaScript框架&#xff0c;它提供了大量的工具和特性&#xff0c;使得web前端开发更加高效和灵活。其中之一就是Vue-router&#xff0c;它是Vue.js官方路由插件&#xff0c;可以实现前端路由的管理和控制。在使用Vue-router时&#xff0c;我们可以利用钩子函…

VsCode指定插件安装目录

VsCode指定插件安装目录 VsCode安装的默认目录是在用户目录(%HomePath%)下的.vscode文件夹下的extensions目录下&#xff0c;随着安装插件越来越多会占用大量C盘空间。 指定VsCode的插件目录 Vscode安装目录&#xff1a; D:\Microsoft VS Code\Code.exeVscode插件安装目录&a…

Linux搭建JavaEE环境

Linux搭建JavaEE环境 需要在 Linux 下进行 JavaEE 的开发&#xff0c;我们需要安装如下软件 JDKtomcatmysqlidea 安装JDK 安装步骤 首先去官网下载jdk的linux版本 下载地址&#xff1a;https://www.oracle.com/cn/java/technologies/downloads/ 1) mkdir /opt/jdk 2) 通过 …

C语言二级易忘易错易混知识点(自用)

1.数组名不能自加。 因为数组名实际上是一个指针&#xff0c;指向数组的第一个元素的地址。数组名在编译器中被视为常量&#xff0c;它的值是固定的&#xff0c;不能改变。 要访问数组的不同元素&#xff0c;应该使用数组名加上偏移量的方式来访问。 2.共用体只有最后一次赋值…

计算机组成原理----计算机系统

目录 1.计算机的硬件和软件 2.硬件的发展 3.软件的发展 4.计算机硬件的基本组成 &#xff08;1&#xff09;早期冯诺依曼机的结构 &#xff08;2&#xff09;现代计算机的结构 5.各硬件的工作原理 &#xff08;1&#xff09;主存储器 &#xff08;2&#xff09;运算器…