android网络请求(Android网络请求库【OkHttp4.9.3】基本用法与原理分析)

2024-07-26 22:40:49 1

android网络请求(Android网络请求库【OkHttp4.9.3】基本用法与原理分析)

这篇文章给大家聊聊关于android网络请求,以及Android网络请求库【OkHttp4.9.3】基本用法与原理分析对应的知识点,希望对各位有所帮助,不要忘了收藏本站哦。

本文目录

Android网络请求库【OkHttp4.9.3】基本用法与原理分析

OkHttp是一套处理 HTTP 网络请求的依赖库,由 Square 公司设计研发并开源,目前可以在 Java 和 Kotlin 中使用。对于 Android App 来说,OkHttp 现在几乎已经占据了所有的网络请求操作,Retrofit + OkHttp实现网络请求似乎成了一种标配。因此它也是每一个 Android 开发工程师的必备技能,了解其内部实现原理可以更好地进行功能扩展、封装以及优化。

OkHttp的高效性体现在:

第一步:创建OkHttpClient,创建OkHttpClient有两种方式:

OkHttpClient提供了丰富的配置方法,例如添加拦截器、指定连接池、设置请求超时等等。

第二步:创建请求

使用Request.Builder() 构建Request实例

第三步:发起网络请求

OkHttp支持同步和异步两种请求方式

OkHttp的使用方法非常简单,三步操作就可以发起一个简单的同步或异步请求。我们也可以很轻松地对网络请求进行配置,例如添加请求头、设置请求方式、设置请求超时等等,这些配置参数会在源码分析过程中详细介绍。

现在我们已经学会了三步操作发起网络请求,接下来以这三个步骤为切入点,深入到源码中学习OkHttp的实现原理,废话少说马上开车。

OkHttpClient创建方式有两种,我们看看两种方式有什么区别。

第一种直接使用默认构造函数,内部依然是使用建造者模式

第二种使用建造者模式

两种方式最终都是调用构造函数OkHttpClient(builder:Builder),由参数builder负责所有的参数配置工作。

当您创建单个OkHttpClient实例并将其用于所有 HTTP 调用时,OkHttp 性能最佳。 这是因为每个OkHttpClient都拥有自己的连接池和线程池,重用连接和线程可减少延迟并节省内存。 相反,为每个请求创建一个客户端会浪费空闲池上的资源。

Request同样使用建造者模式来创建,这里贴上部分重要源码,很简单就不细说了。

OkHttp发起网络请求分为同步请求和异步请求两种方式,我们只分析异步请求流程,因为只要理解了异步请求过程,基本上也就明白同步请求是怎么一回事了。

RealCall是连接应用层与网络层的桥梁,负责处理连接、请求、响应和数据流。

Dispatcher维护着一套异步任务执行策略,分析策略之前先介绍几个重要概念:

client.dispatcher.enqueue(AsyncCall(responseCallback)) 执行步骤为:

AsyncCall实现了Runnable接口,因此一旦被线程池中的线程处理就会调用它的run()方法:

话休絮烦,我们开始分析拦截器责任链:

责任链执行流程:首先获取当前拦截器interceptor,并且调用interceptor.intercept(next)执行拦截器操作。这里的next表示的是index+1后的责任链对象,拦截器的intercept()方法内部会调用next.proceed(request)方法再次进入到责任链,由于此时index已经加1,所以处理的是下一个拦截器。

如此循环往复,直到处理完责任链上最后一个拦截器为止。

注意除最后一个拦截器CallServerInterceptor不会调用chain.proceed(request)方法之外,其他拦截器都应该至少调用一次chain.proceed(request)方法。

为了验证上面的结论,我们进入到RetryAndFollowUpInterceptor的intercept()方法一探究竟:

可以看到注释1处重新进入责任链处理下一个拦截器。

有兴趣可以自行查看最后一个拦截器CallServerInterceptor源码,此处只给出本人阅读源码后得出的结论:

以上就是拦截器责任链的工作流程,我们再通过流程图仔细感受一下。

分析完拦截器责任链,我们继续分析AsyncCall#run()方法:

我们看到,如果getResponseWithInterceptorChain()方法成功获得服务端返回的数据,则调用responseCallback.onResponse(this@RealCall, response)方法完成异步回调;如果服务端数据获取失败(请求异常),则调用responseCallback.onFailure(this@RealCall, canceledException)方法完成异步回调

需要注意的是,responseCallback回调是在子线程中完成的,所以如果想把数据显示到UI上,需要切换回主线程进行UI操作。

OkHttp发起网络请求全过程:

【知识点】OkHttp 原理 8 连问

Android Okhttp/Retrofit网络请求加解密实现方案

比较安全的方案应该是AES+RSA的加密方式。具体如下图所示。 为什么要这样做呢? 1、RSA是非对称加密,公钥和私钥分开,且公钥可以公开,很适合网络数据传输场景。但RSA加密比较慢,据说比AES慢100倍,且对加密的数据长度也有限制。 2、AES是对称加密,加密速度快,安全性高,但密钥的保存是个问题,在网络数据传输的场景就很容易由于密钥泄露造成安全隐患 3、所以,AES+RSA结合才更好,AES加密数据,且密钥随机生成,RSA用对方(服务器)的公钥加密随机生成的AES密钥。传输时要把密文,加密的AES密钥和自己的公钥传给对方(服务器)。对方(服务器)接到数据后,用自己的私钥解密AES密钥,再拿AES密钥解密数据得到明文。这样就综合了两种加密体系的优点。 4、除上面说的外,还可以加签名,即对传输的数据(加密前)先做个哈希,然后用自己的RSA私钥对哈希签名(对方拿到自己的公钥可以验签),这样可以验证传输内容有没有被修改过。 就java来说,加密的输入和输出都是字节数组类型的,也就是二进制数据,网络传输或本地保存都需要重新编码为字符串。推荐使用Base64。Android 有自带的Base64实现,flag要选Base64.NO_WRAP,不然末尾会有换行影响服务端解码。 Android中Base64加密 总而言之,这些不同语言都有实现库,调用即可,关键是参数要一致,具体还需要和后台联调一下。 rsa加解密的内容超长的问题解决 现在说到网络框架,应该毫无疑问是Retrofit了。上面说的加密方案说到底还是要在网络请求框架内加上,怎么做入侵最小,怎么做最方便才是重点。 1、坑定不能直接在接口调用层做加密,加参数,这样每个接口都要修改,这是不可能的。 2、ConverterFactory处理,这也是网上可以搜到的很多文章的写法,但我觉得还是有入侵。而且有点麻烦。 3、OkHttp添加拦截器,这种方法入侵最小(可以说没有),实现呢也非常优雅。 下面的实现,网上也找不到多少可以参考的文章,但不得不说,OkHttp的封装和设计真的很好用,所见即所得。看下源码,就知道该怎么用了,连文档都不用查。 主要注意点: 0、和接口无关的新加的数据放在请求头里。 1、该close的要close,不然会内存泄漏。 2、新旧Request和Response要区分好,新的要替换旧的去传递或返回。 3、要对response.code()做处理,只有在和后台约定好的返回码下才走解密的逻辑,具体看自己的需求,不一定都是200。

Android 息屏网络请求失败问题简单总结

短信拦截APP,正常情况下网络请求正常,息屏情况下网络请求失败(错误信息提示: W/IInputConnectionWrapper: showStatusIcon on inactive InputConnection 、 Failed to connect to /XXX 等) 以测试机红米3为例: 1.设置-WLAN-高级设置-在休眠状态下保持WLAN网络连接(始终); 2.设置-电能和性能-省电优化-应用智能省电-选择要被设置的应用-选择无限制; ***隐藏网址******隐藏网址***

完美解决Android 9.0以上HTTP网络请求被限制问题

Android P 9.0以上系统,HTTP网络被限制。HTTPS无影响。 Android 10系统同样的问题。 Android P以上要求网络请求必须为Https,Http请求会抛异常。   Android P以上的应用默认都被限制了明文流量的网络请求,非加密的流量请求都会被系统禁止掉。同时,目标API级别为27或更低的应用程序的默认值为“ true”。面向API级别28或更高级别的应用默认为“ false”。 需要在AndroidManifest.xml文件中设置:   android:usesCleartextTraffic 指示应用程序是否打算使用明文网络流量,例如明文HTTP。 ***隐藏网址***   避免明文通信的主要原因是缺乏机密性,真实性和防篡改保护;网络攻击者可以窃听所传输的数据,并且还可以对其进行修改而不会被检测到。 别忘记在Android.Manifest.xml文件中添加网络访问权限哦!

Android Studio网络请求插件Http Editor Client

编写Android程序的时候,经常会先测试一下后端给的接口。如果是GET请求还好,我们直接把url复制到浏览器,但是POST请求,浏览器就不好模拟,此时相信很多人都会使用Postman。但是为了测试一个POST请求的接口,我还要打开Postman应用,个人认为太麻烦!此时我用的Http Editor Client插件来模拟POST请求,此插件再Idea中是自带的,在Android Studio 中要自行安装。新建一个后缀为.rest文件

Android 9.0 无法请求网络问题

***隐藏网址*** 1.把targetSdkVersion 改成27或者以下 2.在res目录添加一个xml文件夹和network_security_config.xml: xml内容是: 然后再在AndroidManifest.xml的application里加入 这样就行了。

Android开发:网络请求延迟下使用loading,缓解尴尬~~~

1.在所需xml文件布局下添加以下内容 2.所需文件在drawable下生成anim_loading.xml文件

如果你还想了解更多这方面的信息,记得收藏关注本站。

android网络请求(Android网络请求库【OkHttp4.9.3】基本用法与原理分析)

本文编辑:admin

更多文章:


excel表格自动汇总公式(怎么在excel表格里设置自动计算公式)

excel表格自动汇总公式(怎么在excel表格里设置自动计算公式)

本文目录怎么在excel表格里设置自动计算公式Excel求和Excel表格自动求和公式有哪些excel表格如何把筛选出来的数据自动求和EXCEL汇总公式EXCEL分类汇总的公式怎么写EXCEL表格的几页里面的数据自动求和怎么做怎么在exce

2024年7月17日 17:36

split函数 sql(求sql split函数的用法)

split函数 sql(求sql split函数的用法)

大家好,如果您还对split函数 sql不太了解,没有关系,今天就由本站为大家分享split函数 sql的知识,包括求sql split函数的用法的问题都会给大家分析到,还望可以解决大家的问题,下面我们就开始吧!本文目录求sql split

2024年7月26日 14:45

60帧视频编辑软件(抖音60帧视频怎么弄的)

60帧视频编辑软件(抖音60帧视频怎么弄的)

本文目录抖音60帧视频怎么弄的60帧的视频怎么剪辑pr60帧电影视频调色参数用手机如何做60帧视频视频怎么调60帧,用什么软件抖音60帧视频怎么弄的抖音短视频App暂时不能给视频补帧,60帧视频是在其它软件中制作完成的,比如说在PR中,首先

2024年6月28日 18:42

sql逻辑运算符(T-sql的关系运算符有哪些)

sql逻辑运算符(T-sql的关系运算符有哪些)

本文目录T-sql的关系运算符有哪些sql语句的and和or怎么确定执行的先后顺序sql语句中 0什么意思98.SQL语言中,运算有:算术运算、逻辑+运算、()运算和赋值运算sql中,or与and 的运算级别是不是一样的sql语句能做乘除法

2024年4月15日 04:35

微信小程序onload(启动微信小程序必须要参数为空)

微信小程序onload(启动微信小程序必须要参数为空)

各位老铁们,大家好,今天由我来为大家分享微信小程序onload,以及启动微信小程序必须要参数为空的相关问题知识,希望对大家有所帮助。如果可以帮助到大家,还望关注收藏下本站,您的支持是我们最大的动力,谢谢大家了哈,下面我们开始吧!本文目录启动

2024年10月5日 21:35

c语言书籍大一(请介绍适合大一学生(没有相关基础)自学的C语言辅导教材)

c语言书籍大一(请介绍适合大一学生(没有相关基础)自学的C语言辅导教材)

本文目录请介绍适合大一学生(没有相关基础)自学的C语言辅导教材计算机专业大一新生,有没有推荐的c语言辅导书大一新生学习c语言,有什么必看的书籍,或者有什么建议请介绍适合大一学生(没有相关基础)自学的C语言辅导教材C++ Primer 被《

2024年7月5日 04:33

plc编程软件配置要求(安装PLC编程软件及Wincc软件电脑配置须多大)

plc编程软件配置要求(安装PLC编程软件及Wincc软件电脑配置须多大)

大家好,如果您还对plc编程软件配置要求不太了解,没有关系,今天就由本站为大家分享plc编程软件配置要求的知识,包括安装PLC编程软件及Wincc软件电脑配置须多大的问题都会给大家分析到,还望可以解决大家的问题,下面我们就开始吧!本文目录安

2024年7月13日 15:30

matlab2022a和b(装matlab2022b不稳定吗)

matlab2022a和b(装matlab2022b不稳定吗)

本文目录装matlab2022b不稳定吗matlab2022b发布时间matlab2022b激活密钥用不了怎么办装matlab2022b不稳定吗是。通过查询matlab2022b官网得知,装matlab2022b是不稳定的,MATLAB 2

2024年6月28日 23:08

tif是什么格式(tif是什么格式怎么转换其他格式的图片)

tif是什么格式(tif是什么格式怎么转换其他格式的图片)

大家好,今天小编来为大家解答以下的问题,关于tif是什么格式,tif是什么格式怎么转换其他格式的图片这个很多人还不知道,现在让我们一起来看看吧!本文目录tif是什么格式怎么转换其他格式的图片什么是TIF格式tif格式与tiff格式区别,JP

2024年8月31日 08:35

java代码在哪里编写(java用什么软件编写代码)

java代码在哪里编写(java用什么软件编写代码)

本文目录java用什么软件编写代码学会java在哪帮人写代码如何使用Eclipse编写自己的第一个Java代码怎么用java写下面的代码Java编写程序代码写在哪java的代码要写在eclipse里的什么地方啊jsp环境 在哪里写java代

2023年8月7日 09:20

y 1+ln(x+2)的反函数怎么求(求函数y=1+ln(x+2)的反函数,过程)

y 1+ln(x+2)的反函数怎么求(求函数y=1+ln(x+2)的反函数,过程)

各位老铁们,大家好,今天由我来为大家分享y 1+ln(x+2)的反函数怎么求,以及求函数y=1+ln(x+2)的反函数,过程的相关问题知识,希望对大家有所帮助。如果可以帮助到大家,还望关注收藏下本站,您的支持是我们最大的动力,谢谢大家了哈,

2024年8月20日 13:20

deafen(deafening是什么意思)

deafen(deafening是什么意思)

本文目录deafening是什么意思70题改选什么deafen和drown都有一种声音盖过另一种声音的意思the silence was deafening如何理解deafening是什么意思deafening 英[ˈdefnɪŋ]美[ˈd

2024年7月6日 19:24

painted怎么读(painted怎么读)

painted怎么读(painted怎么读)

本文目录painted怎么读painted怎么读 英语painted怎么读i painted it怎么读Painted英文怎么读painted怎么读painted读音英。释义:adj.描画的;着色的;刷上油漆的v.油漆(paint的过去式和

2024年7月23日 19:22

squared翻译(关于文具的英语单词10个要翻译)

squared翻译(关于文具的英语单词10个要翻译)

大家好,squared翻译相信很多的网友都不是很明白,包括关于文具的英语单词10个要翻译也是一样,不过没有关系,接下来就来为大家分享关于squared翻译和关于文具的英语单词10个要翻译的一些知识点,大家可以关注收藏,免得下次来找不到哦,下

2024年7月23日 04:35

imtoken是什么意思(imtoken.net是什么)

imtoken是什么意思(imtoken.net是什么)

本文目录imtoken.net是什么想知道imtoken是什么imtoken宽带是什么意思imtoken.net是什么imToken 是一款颇具影响力的移动端轻钱包。旨在为区块链领域的用户提供安全放心、简单好用、功能强大的数字资产管理工具。

2024年7月15日 22:46

arp欺骗攻击原理(请详细讲解一下ARP攻击与欺骗的原理)

arp欺骗攻击原理(请详细讲解一下ARP攻击与欺骗的原理)

本文目录请详细讲解一下ARP攻击与欺骗的原理简述ARP攻击的原理以及如何防护arp攻击的原理是什么简述ARP攻击原理ARP 断网攻击的原理是什么如何完全防护arp攻击原理是什么啊请详细讲解一下ARP攻击与欺骗的原理ARP欺骗的原理就是通过项

2024年7月3日 21:03

大华监控web service(大华监控器怎么与手机连接就是用手机实时监控摄像头拍摄到的画面,详细步骤)

大华监控web service(大华监控器怎么与手机连接就是用手机实时监控摄像头拍摄到的画面,详细步骤)

本文目录大华监控器怎么与手机连接就是用手机实时监控摄像头拍摄到的画面,详细步骤大华监控服务器怎么查看摄像头最多连接数大华监控头显示主页不可访问怎么回事大华硬盘监控主机远程无法登录,有登录框,每次打开都要装控件,如何解决大华综合监控管理平台拒

2024年7月8日 12:29

最简单的代码炫酷(为甚么我的美国同学数学不好,却可以写出漂亮的代码)

最简单的代码炫酷(为甚么我的美国同学数学不好,却可以写出漂亮的代码)

本文目录为甚么我的美国同学数学不好,却可以写出漂亮的代码作为一个会写代码的人,觉得自己最酷是什么时候为甚么我的美国同学数学不好,却可以写出漂亮的代码数学好不好,与写出漂亮的代码没有必然的联系。主要是编码工具是否非常的熟练、业务逻辑思维是否理

2024年5月9日 07:24

sumproduct函数结果为0(请教一个sumproduct函数问题,计算出来等于0,这是为什么呢)

sumproduct函数结果为0(请教一个sumproduct函数问题,计算出来等于0,这是为什么呢)

本文目录请教一个sumproduct函数问题,计算出来等于0,这是为什么呢excel sumproduct函数结果为0sumproduct函数为什么会等于零为什么excel运用sumproduct函数计算结果为0请教一个sumproduct

2024年6月5日 08:18

hbuilder隐藏代码行?dw和hbuilder代码能通用吗

hbuilder隐藏代码行?dw和hbuilder代码能通用吗

本文目录hbuilder隐藏代码行dw和hbuilder代码能通用吗hbuilder隐藏代码行hbuilder左边的项目管理器不见了原因:如果是把项目管理器隐藏了,在菜单视图里打开;如果是需要打开的文件和项目管理器联动,在项目管理器右上角有

2024年7月23日 04:13

近期文章

本站热文

iphone vpn设置(ios设置vpn快捷开关)
2024-07-22 15:01:12 浏览:2342
windows12正式版下载(操作系统Windows Server 2012 R2,在哪能下载到,公司用的)
2024-07-20 17:26:53 浏览:1736
client mfc application未响应(每次进cf就提示client MFC Application未响应该怎么办啊!急急急)
2024-07-20 11:15:58 浏览:1168
java安装教程(win10如何安装JAVA)
2024-07-19 19:55:49 浏览:1164
标签列表

热门搜索