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

Silvaco TCAD | GaN HEMT器件仿真与高频功率应用实战 本文详细介绍了使用Silvaco TCAD进行GaN HEMT器件仿真的全流程,涵盖器件结构设计、极化效应建模、高频特性分析及功率损耗优化。通过实战案例展示了GaN HEMT在电动汽车电驱和快充模块等高频功率应用中的性能优势与效率提升策略,为工程师提供可靠的仿真方法与设计验证手段。 阅读详情

相关推荐

SiC MOSFET驱动设计实战:从特性解析到电路优化

本文深入解析SiC MOSFET的核心特性及其驱动电路设计要点,涵盖高温稳定性、快速开关能力等关键特性,并提供驱动电压配置、电流能力计算、布局优化等实用方案。特别针对第三代电力电子半导体SiC MOSFET的驱动要求,分享STGAP1AS等典型驱动方案的应用技巧,助力工程师解决高频应用中的EMI和热管理挑战。

weixin_29230865的博客 365

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

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

2401_84519718的博客 1022

医学图像处理实战:ABIDE数据集获取与预处理全攻略

本文详细介绍了ABIDE数据集的获取与预处理全流程,涵盖官方脚本下载、Nilearn库高效下载、数据预处理与格式转换等关键步骤。ABIDE数据集作为自闭症脑成像研究的重要资源,提供了标准化的功能磁共振成像数据,适合机器学习模型训练。文章还提供了常见问题排查与优化建议,帮助开发者高效处理医学图像数据。

weixin_29069131的博客 255

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

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

海阔天空 1万+

LoRa模块选型指南:正点原子ATK-LORA-01与SX1278芯片深度评测(含实测距离/功耗数据)

本文深度评测了正点原子ATK-LORA-01与SX1278芯片的性能表现,通过实测数据展示其在复杂环境中的通信距离与功耗表现。特别适合智慧农业、工业监测等物联网应用场景,提供详细的配置指南和优化技巧,帮助开发者实现高效、低功耗的LoRa通信解决方案。

weixin_29191081的博客 290

教你搞懂RT-Thread的移植和配置ENV工具环境

RT-Thread的移植和配置ENV工具环境

Troubadour~的博客 8263

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

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

tianyaleixiaowu的专栏 2万+

西瓜书第二章——模型评估与选择(十折交叉验证/查准查全F1)

第二章——模型评估与选择

xsddys的博客 953

Retrofit详解(下)

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

Charon_Chui的专栏 525

树莓派CM4 PCIe扩展方案与ASM1184e芯片应用

PCIe(Peripheral Component Interconnect Express)是计算机硬件中重要的高速串行总线标准,广泛应用于存储、网络等设备连接。其核心原理是通过差分信号实现高带宽传输,PCIe Gen2 x1的理论带宽可达5Gbps。在嵌入式开发中,PCIe扩展技术能有效解决单板计算机接口不足的问题,特别适合树莓派等微型平台。ASMedia ASM1184e作为PCIe交换芯片,可将单个接口扩展为多个,支持热插拔且免驱动,极大提升了工程灵活性。通过PCIe交换机方案,开发者能在树莓派CM

weixin_42602368的博客 421

Openclaw错误排查及解决方案之:Previous run is still shutting down. Please try again in a moment.

Openclaw错误排查及解决方案之:Previous run is still shutting down. Please try again in a moment.

多媒体编程、网络编程、系统编程、网络安全编程、驱动编程 232

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

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

aehvbew8628的博客 214

SOI LDMOS器件的Sentaurus TCAD建模与关键电学特性仿真研究

本文研究了SOI LDMOS器件的TCAD建模与电学特性仿真。通过Sentaurus TCAD平台建立了单RESURF结构的SOI LDMOS模型,详细阐述了器件结构原理和RESURF耐压机制。研究采用SDE进行几何定义和掺杂配置,在Sentaurus Device中构建了完整的物理模型体系,包括迁移率、复合和碰撞电离模型。通过系统仿真提取了器件的转移特性、输出特性和击穿特性等关键参数,分析了各参数对性能的影响规律。研究结果为功率半导体器件的仿真建模提供了规范化参考,有助于优化SOI LDMOS的性能设计。

huanghm88的专栏 134

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

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

functionflux的博客 1350

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

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

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

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

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

weixin_41802023的博客 2479

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

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、付费专栏及课程。

余额充值