Android中使用Retrofit库进行Http通讯

retrofit应用详解与源码解析--概述 Retrofit和OkHttp一样都是Jake Wharton大神的杰作,读书要读经典,学框架也要学经典,因为经典它经得起历史的考验,得到了人们的认可,我们不但要学会用,还要学习框架所体现出来的优秀的设计思想,设计原则,设计技巧和设计模式,以及脱离框架类似功能的实现方法,retrofit是基于okhttp构建的,因此retrofit所有的工作都是围绕RequestBody和ResponseBody展开的,Retrofit可以把一个接口里面定义的方法通过注解的方式把它适配成HTTP的请求命令 阅读详情

合适的就是好的

在Anrdoid中,有很多种Http通讯网络库可供我们使用,比如Volley, OKHttp和Retrofit等,没有最好的,只有最适合的。在不同的场景下,我们会有不同的选择。
如果只是单纯地从服务端的restful api接口中获取json格式的数据,相信很多人都会选择Retrofit,因为其实现起来最简单,最方便。
但是如果还需要从服务端获取图片,那相信很多人会说Volley会做得更好啊,因为Retrofit没有现成的接口,而Volley有NetworkImageView或者ImageRequest等,但可能也会有人说,直接用Glide和Picasso会更舒服呀。

如何使用Retrofit

目前都是用Android Studio 来进行开发的,依赖什么的都是通过 gradle来配置,所以按照以下几步走:

Gradle配置
    compile 'com.squareup.retrofit2:retrofit:2.0.0-beta3'
    compile 'com.squareup.retrofit2:converter-gson:2.0.0-beta3'

其中converter-gson,是retrofit2提供的,将Response的Body转化为json对象的方法,也就是说Retrofit2提供了关于Json的转化,我们不需要自己再去做这个处理了。

Proguard配置

在导入任何第三方包的时候,我第一个总会去找其Proguard配置是什么。一般来说,官方提供的文档中会告诉我们如何使用这些库,也会提供一段Proguard配置来让我们在应用中进行配置

#retrofit
-dontwarn retrofit2.**
-keep class retrofit2.** { *; }
-keepattributes Signature
-keepattributes Exceptions

在这里,其实有一点要注意的,-keepattributes Signature,是为了Gson配置的,是因为Gson在转化Field(字段)的时候会使用到存储在类中泛型信息,而Proguard默认会将这些信息给移除掉,所以我们需要Keep住这些Signature。Signature 是字段,方法和类的签名信息,用来标识其唯一性的。同一个方法,参数不同,如何区分,其实就是靠Signature。

声明接口 TestService

声明我们需要与服务器进行通讯的请求,包括请求类型,请求地址,请求参数,参数的形式等。

public interface TestService {
    @FormUrlEncoded
    @POST("http://ip:port/api/login")
    Call<LoginResult> login(@Field("username") String username,
                            @Field("password") String password);
}

注释 @FormUrlEncoded 指明了请求的内容(content)会使用 form-encoded 的形式,而我们想要传递给服务器的参数,则必须用 @Field 来指定,如上述方法,指定了login方法会指向服务器的http://ip:port/api/login 接口,请求类型是 Post,指定参数为 username 和 password,而Call 则是Retrofit 定义的一次发送Request并接收Response的一个接口,可以将其看作是一次请求的触发。

创建Retrofit和TestService对象
 Retrofit retrofit = new Retrofit.Builder()
                    .baseUrl(SharedPreferenceHelper.getServerHost())
                    .addConverterFactory(GsonConverterFactory.create())
                    .client(buildClient())
                    .build();
 TestService service = retrofit.create(TestService.class);

通过Retrofit.Builder.build() 方法,我们可以创建Retrofit对象,再通过Retrofit对象,我们创建TestService对象,从而真正地将 TestService 接口实例化。

  • 利用 baseUrl 方法,我们可以指明服务器地址,比如:
.baseUrl("http://192.168.1.100")

则我们指定了服务器地址为 http://192.168.1.100,这样,我们在声明接口TestService的api时,就可以只声明路径,如下:

    @FormUrlEncoded
    @POST("/api/login")
    Call<LoginResult> login(@Field("username") String username,
                            @Field("password") String password);
  • 利用 addConverterFactory(GsonConverterFactory.create()) 添加 Gson 转换

这就是我们在 build.gradle中引入的 converter-gson 使用的地方了。

  • 利用 client 方法,我们可以添加一些 Interceptor 来记录请求的参数,整个请求的时间等。
    如下,我们可以声明一个LoggingInterceptor,如下:
public class LoggingInterceptor implements Interceptor{

    @Override
    public Response intercept(Chain chain) throws IOException {

        Request request = chain.request();
        long t1 = System.nanoTime();
        Logger.v("request:" + request.toString());
        if (request.body() != null) {
            FormBody body = (FormBody) request.body();
            int size = body.size();
            for (int i = 0; i < size; i++) {
                Logger.v(body.name(i) + " : " + body.value(i));
            }
        }
        Response response = chain.proceed(request);
        long t2 = System.nanoTime();
        Logger.v(String.format("received " + response.toString() + " in %.1fms%n", (t2 - t1) / 1e6d));
        return response;
    }
}

在这里,通过 FormBody(因为我们使用的是 Form-Encoded的方法)来将RequestBody其中的参数和值给打印出来,同样的,我理所当然地以为,也可以将response.body也可以打印出来,发现可以通过response.body.string() 方法,可以将response的内容给打印出来,比如这样

if (response.body() != null) {
   Logger.v("response.body: " + response.body().string());
}

结果,真的打印出来了,如我所愿,然而,踩坑了。


!!,在这里有个坑,不能使用 response.body.string() 方法, 因为 string() 方法会将response的内容给读取了,导致整个请求关闭,这样在后续操作,就会收到Exception: close了。


定义了 LoggingInterceptor,创建OKHttpClient,如下:

    private static OkHttpClient buildClient() {
        OkHttpClient client = new OkHttpClient.Builder()
                .addNetworkInterceptor(new LoggingInterceptor())
                .build();
        return client;
    }

再通过 .client(buildClient)方法,设置给Retrofit,达到在TestService调用方法的时候进行拦截。

调用TestService.login方法创建Call,将调用Call的enqueue方法
    private void doLogin() {
       Call<LoginResult> call = testService.login("username","password");            
       call.enqueue(new Callback<LoginResult>() {
            @Override
            public void onResponse(Response<LoginResult> response) {
                LoginResult loginResult = response.body();
                //do something about loginResult
            }

            @Override
            public void onFailure(Throwable t) {
                //do something about throwable t
            }
        });
    }

通过 call.enqueue方法,将call放进请求队列里,并声明一个Callback,通过callback的onResponse方法和onFailure方法,分别对正常的Response和请求过程中出现的错误进行处理。

对Retrofit2的基本使用,到此就结束了。

参考并感谢
高效率http retrofit okhttp
Retrofit
Interceptors

【嘉立创EDA】PCB 多层板如何交换内层,4层板交换板层 本文使用嘉立创EDA,描述如何在PCB设计时,如何交换各个板层,特别是4层板需要交换内层时,应该如何操作,以供有需要的读者参考。 阅读详情

相关推荐

STM32 CAN发送丢包?3个邮箱轮询法实测有效(附代码)

本文深入分析了STM32 CAN总线发送丢包的根本原因,指出其内置CAN控制器的三个发送邮箱是硬件瓶颈。针对高负载场景,提供了实测有效的优化方案,重点介绍了非阻塞的邮箱状态轮询法,该方法通过主动轮询三个邮箱的空闲状态,充分利用硬件资源,显著提升发送稳定性并避免任务阻塞。文中附有可直接使用的示例代码。

weixin_29189381的博客 195

【Android】网络编程之OKHTTP与Retrofit框架

2. 原生HTTP网络访问的缺点3. OKHTTPHTTP是现代应用程序网络的方式。这就是我们的方式。有效地执行 HTTP 会使内容加载速度更快并节省带宽。OkHttp 适用于 Android 5.0+(API 级别 21+)和 Java 8+。3.1 框架引入框架官网地址添加网络请求权限添加依赖3.2 框架使用。

2401_84519718的博客 1022

JAVA + 海康威视SDK + FFmpeg+ SRS 实现海康威视摄像头二次开发

海康威视SDK接入方案摘要 本文介绍了使用海康威视官方SDK开发物联网平台摄像头接入功能的完整方案。系统采用Java后端集成HCNetSDK控制摄像头,通过FFmpeg将RTSP流转为RTMP推送到SRS流媒体服务器,前端基于HTTP-FLV协议实现视频播放。文章详细说明了开发准备工作,包括SDK下载、SRS部署、FFmpeg安装等关键步骤,并提供了数据库表设计和接口定义。核心部分展示了如何集成海康SDK,包括提取必要代码、加载DLL文件、配置打包插件等具体实现细节,最终形成了一套支持实时预览、回放和下载的

2401_83057947的博客 2263

Android网络框架Retrofit2使用封装:Get/Post/文件上传/下载

背景 Android开发中的网络框架经过多年的发展,目前比较主流的就是Retrofit了,Retrofit2版本出现也有几年了,为了方便使用,特封装了一些关于Retrofit2的代码,分享给大家。 框架主要包括: Get请求 Post请求 文件上传 文件下载 使用效果预览: Retrofit对象 Retrofit框架内部使用的还是OkHttp框架,在实例化的时候可以自定义OkHttpClie...

海阔天空 1万+

Silvaco Athena实战:从零搭建MOSFET工艺仿真流程(附mos1ex03完整代码解析)

本文详细介绍了使用Silvaco Athena从零搭建MOSFET工艺仿真的全流程,包括环境配置、核心工艺步骤、器件成型及参数提取等关键环节。通过mos1ex03案例的完整代码解析,帮助读者掌握网格划分、氧化层生长、离子注入等实战技巧,提升半导体工艺仿真能力。

weixin_42648844的博客 406

代号OneNET02 STM32+ESP8266 WIFI系列-第2节-STM32单片机通过ESP8266连接WIFI访问OneNET OTA服务器实现SOTA远程程序升级

第2节-STM32单片机通过ESP8266连接WIFI访问OneNET OTA服务器实现SOTA远程程序升级,这一节主要是实现通过OneNET OTA服务器将需要更新的程序远程下载到STM32单片机,这一节主要是引导程序和应用程序的讲解。

weixin_44862509的博客 1904

解决retrofit OKhttp创建大量对外连接时内存溢出

这个问题是这样发生的,我的表中有一批数据,量级较大,数百万个,它们有个地址Address字段,标明了地理位置。我需要对这一批数据根据地址去百度或者高德地图去查询经纬度,并且保存下来。 原本是直接分页读取该表,每次读取几百条,然后一条一条去获取经纬度并且保存。后来发现实在太慢,一秒也就能处理个三五条。所以开启了多线程,大约30个线程,每个线程处理不同id范围的数据。 此时问题出现了,每个线程中都有

tianyaleixiaowu的专栏 2万+

Windows+VSCode+Cline+MCP全流程配置指南

本文提供了一份详细的Windows+VSCode+Cline+MCP全流程配置指南,旨在帮助开发者打造高效的AI辅助编码工作站。文章从环境准备讲起,逐步指导安装VSCode、配置Cline插件、搭建Node.js环境,并重点详解如何通过MCP为Cline集成文件系统和GitHub等工具服务器,实现用自然语言操控开发环境,从而显著提升日常编码与文件管理效率。

weixin_28840143的博客 552

Retrofit详解(下)

Retrofit详解(下) 上一篇文件介绍了Retrofit的基本使用,接下来我们通过从源码的角度分析一下Retrofit的实现。 首先看一下它的基本使用方法: // 1 Retrofit retrofit = new Retrofit.Builder() .baseUrl("https://api.github.com/") .addCo...

Charon_Chui的专栏 525

logisim中,如何设计一个位于十字路口的交通信号灯控制系统?

🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者,还是负责复杂项目的资深工程师,都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论,助你稳步进阶、放大技术价值。

**My Coding Family** 1342

智能车图像处理9-进阶篇1--中线的提取

(1)10-50行 基础扫线 (2)56-71 断行0 ,就是比如遇到十字,十字路口下方 第一次断线的地方。 (3)83-124 按照原先有效行,拟线作为中值,然后从中值向左右扫线,同时计算赛道宽度。 (4)125-138 如果出现赛道宽度小于先前有效行,则找到二次扫线的起点,从二次扫线起点处,继续向下扫线,直至结束,同时记录最后的有效行。 (5) 310-- 最后计算左右边线类似于方差的值,用于环岛的判断 ***这里着重描述一下二次扫线,希望大家可以理解的深刻

taiyuezyh的博客 1万+

快速Android开发系列网络篇之Retrofit

Retrofit是一个不错的网络请求库,用官方自己的介绍就是: A type-safe REST client for Android and Java 看官网的介绍用起来很省事,不过如果不了解它是怎么实现的也不太敢用,不然出问题了就不知道怎么办了。这几天比较闲就下下来看了一下,了解一下大概实现方法,细节就不追究了。先来看一个官网的例子,详细说明去网官看 简单示...

aehvbew8628的博客 214

【深度学习新浪潮】深度学习特别是大模型在图像配准方面的研发进展

深度学习,尤其是大模型的出现,彻底改变了图像配准的技术范式——从“手工设计特征+几何约束”走向“数据驱动+通用特征学习”。当前,大模型配准已在医学影像、遥感、工业检测等领域实现商业化落地,解决了传统方法难以应对的跨模态、少样本、复杂形变等问题。但大模型配准仍面临推理效率、可解释性、数据隐私等挑战,未来的研发核心将是“精度与效率的平衡”“泛化能力的提升”“场景化适配的简化”。对于开发者而言,从简化版大模型配准代码入手,逐步理解预训练+微调的核心逻辑,是衔接前沿技术的有效路径。

专注:太空算力、AI infra、异构调度、大模型成本工程 424

Retrofit入门指南:Android开发者的HTTP通信利器

Retrofit简明指南:Android高效网络请求框架 Retrofit是Android开发中最受欢迎的HTTP客户端框架之一,基于OkHttp构建,提供简洁的API和类型安全特性。本文介绍了Retrofit的核心优势、基础四步使用流程和进阶技巧。 核心特点: 声明式API定义 支持同步/异步请求 内置多种数据转换器 完善的注解系统 使用步骤: 定义API接口 创建数据模型 构建Retrofit实例 发起异步请求 进阶功能包括: 多种HTTP方法注解 参数注解(路径/查询/请求体等) 文件上传 自定义请求

functionflux的博客 1350

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Retrofit的使用

本文参考网络其他文章,总结出来。 Retrofit Github:https://github.com/square/retrofit 官网教程:http://square.github.io/retrofit/ Retrofit和Java领域的ORM概念类似, ORM把结构化数据转换为Java对象,而Retrofit 把REST API返回的数据转化为Java对象方便操作

Mr_Mercurial的博客 501

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

【安卓面试】网络基础及Android网络框架学习笔记

Android面试必备!包含基础知识和三方框架的整理概括!可当做面试复习索引

weixin_41802023的博客 2479

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Android Retrofit的简单使用案例

Retrofit简单使用步骤 1.配置build.gradle文件(Module:app) compile 'com.squareup.retrofit2:retrofit:2.1.0' compile 'com.squareup.retrofit2:adapter-rxjava:2.1....

choujianpi4487的博客 166

retrofit 只用于android 吗_Android HTTPS 自制证书实现双向认证OkHttp + Retrofit + Rxjava

阅读前请点击右上角“关注”,每天免费获取Android知识解析及面试解答。Android架构解析,只做职场干货,完全免费分享!由于最近要做一个安全性比较高的项目,因此需要用到HTTPS进行双向认证。由于设计项目架构的时候,客户端是采用MVVM架构,基于DataBinding + Retrofit + Rxjava来实现Android端。查阅很多资料,基于原生HttpClient实现双向认证的例子很...

weixin_39915308的博客 101

activity间的通讯机制有哪些?三方的方案有哪些?

在安卓开发中,Activity间的通讯机制以及第三方的通讯方案相当丰富,它们为开发者提供了多种选择和实现方式。

qq_43664361的博客 1148

网络 - Retrofit

根据 JSON 内容,编写对应的实体类。data class Person( //类名后缀加不加Bean随意根据 API 编写网络访问接口。Retrofit 将 Http 请求抽象成接口,并在接口里面采用注解来配置网络请求参数(每个形参都要注解),用动态代理将该接口“翻译”成一个 Http 请求再执行。命名通常以功能名称开头+Service结尾。

HugMua的博客 751

HTTP、WebSocket、XMPP、CoAP、MQTT、DDS 六大协议在机器人通讯场景应用

本文介绍了机器人与Android通信中六大常用协议(HTTP、WebSocket、XMPP、CoAP、MQTT、DDS)的开发库选择方案。针对每个协议,分别推荐了Android端和机器人端的最优开发库,包括Retrofit、OkHttp、Smack、Californium、Paho和FastDDS等,详细分析了各库的核心特性、优势及适用场景,并提供了基础示例代码。文章强调选型时应重点考虑跨端兼容性、场景匹配度和开发复杂度,如HTTP协议推荐Android用Retrofit、机器人用Requests,MQTT

dengfuma的专栏 2006

Android网络层实战:RxJava+Retrofit组合设计与工程落地

在Android开发中,网络请求是应用与服务端交互的核心环节,其稳定性、可维护性与生命周期管理直接决定用户体验和崩溃率。Retrofit通过接口契约抽象HTTP通信,将URL、参数、序列化等语义映射为类型安全的Java方法;RxJava则以响应式流解决异步嵌套、错误传播与线程切换难题。二者结合不仅实现请求自动取消、统一错误兜底、背压防护等关键能力,更支撑起从登录鉴权、分页加载到文件上传的全场景工程实践。本文聚焦真实项目中的初始化配置、动态BaseUrl、不规范JSON容错、生命周期绑定及协程平滑演进路径,为

weixin_34221073的博客 445

Android Http通讯模块封装

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34128411的博客 159

Android异步HTTP客户端深度解析:构建高性能网络通信架构

在移动应用开发中,网络通信的性能直接影响用户体验。当应用需要处理实时数据流、文件上传下载或频繁的API调用时,传统的同步HTTP请求往往导致界面卡顿和响应延迟。Android-async-http库正是为解决这一痛点而生,它基于Apache HttpClient构建,提供了一套完整的异步回调机制,让开发者能够轻松实现高性能的网络通信架构。 ## 技术挑战与需求分析 移动应用网络通信面临多重挑战

gitblog_00812的博客 497

r0capture终极指南:如何10分钟掌握安卓应用抓包通杀技术

你是否曾为安卓应用抓包而头疼?面对复杂的证书校验、SSL绑定和各种加密协议,传统的抓包工具往往束手无策。今天,我要为你介绍一款能够通杀所有安卓应用层抓包场景的神器——r0capture。这个基于Frida框架开发的工具,能够无视证书校验、绕过SSL绑定,让你轻松捕获应用层的所有网络流量。 ## 为什么你需要r0capture?安卓抓包的三大痛点 在移动应用安全分析和逆向工程中,网络流量分析是至

gitblog_00832的博客 1113

Android HTTPS 自制证书实现双向认证(OkHttp + Retrofit + Rxjava)

由于最近要做一个安全性比较高的项目,因此需要用到HTTPS进行双向认证。由于设计项目架构的时候,客户端是采用MVVM架构,基于DataBinding + Retrofit + Rxjava来实现Android端。 查阅很多资料,基于原生HttpClient实现双向认证的例子很多,但对于Retrofit的资料网上还是比较少,官方文档也是一句带过,没有具体的介绍。 看了 《Android中https请...

AndroidAlvin的博客 320
上一篇: 好记性不如烂笔头(三)
下一篇: Java并发系列之Synchronized
linmiansheng
博客等级 码龄20年 507粉丝 111原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值