让Android应用活起来: Retrofit 和 OkHttp的比较参考

目录

前言

OkHttp

Retrofit

对比 


前言

在构建现代 Android 应用时,处理网络请求是一个不可或缺的部分。其中Square 的两个开源库,Retrofit 和 OkHttp,GitHub Star数很多,被很多人选择。在我刚成为一个Android er 的时候,就对这两个库有所耳闻,不过当时果断选择了Okhttp,因为觉得更简单,现在想抽出时间探讨 Retrofit 和 OkHttp 的用法,同时对比它们的不同。

OkHttp

同步Get请求

OkHttpClient client = new OkHttpClient();

HttpUrl.Builder urlBuilder = HttpUrl.parse("url").newBuilder();
urlBuilder.addQueryParameter("a", "b");
String url = urlBuilder.build().toString();

Request request = new Request.Builder()
        .url("url")
        .build();

try (Response response = client.newCall(request).execute()) {
    if (response.isSuccessful()) {
        String responseBody = response.body().string();
        
    } else {
        
    }
} catch (IOException e) {
    
}

同步POST请求

OkHttpClient client = new OkHttpClient();
MediaType MEDIA_TYPE = MediaType.parse("application/json; charset=utf-8");

String postBody = "{\"a\": \"b\", \"c\": \"d\"}";
RequestBody body = RequestBody.create(postBody, MEDIA_TYPE);

Request request = new Request.Builder()
        .url("url")
        .post(body)
        .build();

try (Response response = client.newCall(request).execute()) {
    if (response.isSuccessful()) {
        String responseBody = response.body().string();
        
    } else {
        
    }
} catch (IOException e) {
    
}

异步请求  

client.newCall(request).enqueue(new Callback() {
    @Override
    public void onFailure(Call call, IOException e) {
        
    }

    @Override
    public void onResponse(Call call, Response response) throws IOException {
        if (response.isSuccessful()) {
            String responseBody = response.body().string();
            
        }
    }
});

同步异步使用场景 

大多数UI应用程序和需要与用户交互的场景,应该使用异步请求。

没有用户界面交互,或已经处于后台线程的场景下,可以考虑使用同步请求。

Retrofit

定义Get请求 POST请求 

public interface MyApiService {
    @GET("users/list")
    Call<List<User>> getUserList(@Query("page") int page);
    
    @POST("users/new")
    Call<User> createUser(@Body User user);
}

Retrofit实例

Retrofit retrofit = new Retrofit.Builder()
    .baseUrl("url")
    .addConverterFactory(GsonConverterFactory.create())
    .build();

addConverterFactory(GsonConverterFactory.create())是让Retrofit 使用 Gson 库来处理 JSON 的序列化和反序列化,Retrofit 会使用Gson将 JSON 自动转换为指定的Java类型。 

创建API接口实例

MyApiService apiService = retrofit.create(MyApiService.class);

异步请求

apiService.getUserList(1).enqueue(new Callback<List<User>>() {
    @Override
    public void onResponse(Call<List<User>> call, Response<List<User>> response) {
        if (response.isSuccessful()) {
            List<User> users = response.body();
            
        }
    }

    @Override
    public void onFailure(Call<List<User>> call, Throwable t) {
 
    }
});


User newUser = new User("a", "b");
apiService.createUser(newUser).enqueue(new Callback<User>() {
    @Override
    public void onResponse(Call<User> call, Response<User> response) {
        if (response.isSuccessful()) {
            User createdUser = response.body();
            
        }
    }

    @Override
    public void onFailure(Call<User> call, Throwable t) {
        
    }
});

对比 

  • OkHttp 是更底层的网络库,专注于高效的 HTTP 通信;Retrofit 构建于 OkHttp 之上,做了一层高级的抽象。
  • OkHttp 聚焦于网络请求的发送和响应的接收,Retrofit 则聚焦于将这些请求和响应映射到 Java 接口和类上。

笔者的其他深入Android底层文章推荐

Android源码阅读 SharedPreferences - 1-CSDN博客

Android源码阅读WorkMangaer - 1-CSDN博客

如上为两个系列。

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

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

相关文章

2.3 同步与互斥

1 2 3 4 5 6 7 8 9 10 11 12

【InternLM 实战营第二期笔记】书生·浦语大模型全链路开源体系及InternLM2技术报告笔记

大模型 大模型成为发展通用人工智能的重要途径 专用模型&#xff1a;针对特定任务&#xff0c;一个模型解决一个问题 通用大模型&#xff1a;一个模型应对多种任务、多种模态 书生浦语大模型开源历程 2023.6.7&#xff1a;InternLM千亿参数语言大模型发布 2023.7.6&#…

【ML】类神经网络训练不起来怎么办 5

【ML】类神经网络训练不起来怎么办 5 1. Saddle Point V.S. Local Minima(局部最小值 与 鞍点)2. Tips for training: Batch and Momentum(批次与 动量)2.1 Tips for training: Batch and Momentum2.2 参考文献:2.3 Gradient Descent2.4 Concluding Remarks(前面三讲)3.…

2024年AI威胁场景报告:揭示现今最大的AI安全挑战

AI正彻底改变每一个数据驱动的机会&#xff0c;有可能带来一个繁荣的新时代&#xff0c;让人类的生活质量达到难以想象的高度。但就像任何突破性的新技术一样&#xff0c;伟大的潜力往往蕴含着巨大的风险。 AI在很大程度上是有史以来部署在生产系统中的最脆弱的技术。它在代码…

寒冬继续!飞书发全员信 “适当精简团队规模”

多精彩内容在公众号。 3月26日飞书CEO谢欣发布全员信&#xff0c;宣布进行组织调整&#xff0c;同时为受到影响的“同学”提供补偿方案和转岗机会。 在致员工的一封信中&#xff0c;谢欣坦诚地指出&#xff0c;尽管飞书的团队人数众多&#xff0c;但组织结构的不够紧凑导致了工…

使用HarmonyOS实现图片编辑,裁剪、旋转、亮度、透明度

介绍 本篇Codelab是基于ArkTS的声明式开发范式的样例&#xff0c;主要介绍了图片编辑实现过程。样例主要包含以下功能&#xff1a; 图片的解码。使用PixelMap进行图片编辑&#xff0c;如裁剪、旋转、亮度、透明度、饱和度等。图片的编码。 相关概念 图片解码&#xff1a;读取…

经典机器学习模型(九)EM算法的推导

经典机器学习模型(九)EM算法的推导 1 相关数据基础 1.1 数学期望 1.1.1 数学期望的定义 根据定义&#xff0c;我们可以求得掷骰子对应的期望&#xff1a; E ( X ) X 1 ∗ p ( X 1 ) X 2 ∗ p ( X 2 ) . . . X 6 ∗ p ( X 6 ) 1 ∗ 1 6 2 ∗ 1 6 1 ∗ 1 6 3 ∗ 1 6 …

【考研数学】跟武忠祥,如何搭配汤家凤《1800》?

可以但不建议&#xff01;正所谓原汤化原食&#xff0c;你做1800&#xff0c;当然是听汤神的更合适&#xff01; 汤家凤与武忠祥的讲课风格真的大不相同&#xff01;汤老师特别注重基础和题量&#xff0c;让你在数理思维上打下扎实的根基。而武老师则更偏向于深厚的理论&#…

天地图如何获取多边形面积

目录 一、初始化地图 二、创建polygonTool 三、多边形获取面积 ​四、完整代码&#xff08;包括添加点、添加面、编辑面、获取面积&#xff09; 项目中提出在地图上绘制面并获取面积&#xff0c;如何实现&#xff1f; 在天地图官网的JavaScript API 中&#xff0c;链接如下…

午马传动已确定加入2024第13届生物发酵展

参展企业介绍 浙江午马传动有限公司&#xff0c;办公室地址位于中国长寿之乡、中国椪柑之乡、中国竹炭之乡丽水&#xff0c;浙江省丽水市青田县东源镇项村村前路99号四楼1号&#xff0c;我公司主要提供&#xff1a;齿轮及齿轮减、变速箱制造&#xff1b;机械设备销售&#xff1…

MySQL 8 索引原理详细分析

千山万水总是情, 问问索引行不行? 轻舟已过万重山, 有种尽管来发难。 索引是在数据库优化时的重要手段之一,今天 V 哥从索引的角度展开讲一讲索引的各个要点,希望可以通过这篇文章,帮助大家彻底搞透索引的关键点。 1.索引的定义与作用2.索引的类型3.索引原理4.二分查…

C#学生信息成绩管理系统

一、系统功能描述 本系统包括两类用户&#xff1a;学生、管理员。管理员可以通过系统来添加管理员信息、修改管理员信息、添加学生信息、修改学生信息&#xff1b;开设课程、查询课程、录入成绩、统计成绩、修改成绩、修改个人密码等&#xff0c;而学生则可以通过系统来选择课…

实现DevOps需要什么?

实现DevOps需要什么&#xff1f; 硬性要求&#xff1a;工具上的准备 上文提到了工具链的打通&#xff0c;那么工具自然就需要做好准备。现将工具类型及对应的不完全列举整理如下&#xff1a; 代码管理&#xff08;SCM&#xff09;&#xff1a;GitHub、GitLab、BitBucket、SubV…

智过网:考一级建造师证有什么用?可以从事哪些工作?

随着国家基础设施建设的不断推进&#xff0c;建筑行业在中国经济中占据了举足轻重的地位。在这样的背景下&#xff0c;一级建造师证成为了众多建筑从业者的追求目标。那么&#xff0c;考取一级建造师证究竟有哪些用处&#xff1f;又能从事哪些工作呢&#xff1f;本文将对此进行…

什么是通配符SSL证书?

在当前互联网环境中&#xff0c;数据传输安全至关重要&#xff0c;而通配符SSL证书作为保护多个子域名的理想工具&#xff0c;因其灵活、经济高效的特性而备受瞩目。本文将详细介绍通配符SSL证书的定义、主要特性及其价格区间。 通配符SSL证书的核心特性概述如下&#xff1a; …

rtthread studio 基于bsp生成代码stm32l475正点原子潘多拉,以及硬件配置

1、基于bsp生成代码 rtthread studio 很强大的一个功能就是可以根据芯片或者bsp 生成驱动代码&#xff0c;而且rtthread内核 已经集成到了代码中&#xff01;&#xff01;只需要关注于如何使用硬件和设备完成我们想要的功能就可以&#xff1b; 它的官网文档也特别详细&#x…

【3D目标检测】Det3d—SE-SSD模型训练(前篇):KITTI数据集训练

SE-SSD模型训练 1 基于Det3d搭建SE-SSD环境2 自定义数据准备2.1 自定义数据集标注2.2 训练数据生成2.3 数据集分割 3 训练KITTI数据集3.1 数据准备3.2 配置修改3.3 模型训练 1 基于Det3d搭建SE-SSD环境 Det3D环境搭建参考&#xff1a;【3D目标检测】环境搭建&#xff08;OpenP…

伴随供应链数字化转型的B2B电商

制造业的数字化浪潮正迅猛地席卷全球&#xff0c;新冠病毒大流行和地缘政治格局的改变促进了不同国家和地区企业对供应链数字化转型的的步伐。除了企业内部的加快数字化之外。企业的营销也加快电商化步伐。 企业内部管理的数字化转型会给电商带来怎样的转变&#xff1f;电商如何…

CMOS逻辑门电路

按照制造门电路的三极管不同&#xff0c;分为MOS型、双极性和混合型。MOS型集成逻辑门有CMOS、NMOS、PMOS&#xff1b;双极型逻辑门有TTL&#xff1b;混合型有BiCMOS。 CMOS门电路是目前使用最为广泛、占主导地位的集成电路。早期CMOS电路速度慢、功耗低&#xff0c;后来随着制…

基于springboot+vue+Mysql的就业信息管理系统

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…
最新文章