Android---网络编程优化

网络请求操作是一个  App 的重要组成部分,程序大多数问题都是和网络请求有关。使用 OkHttp 框架后,可以通过 EventListener 来查看一次网络请求的详细情况。一次完整的网络请求会包含以下几个步骤。

也就是说,一次网络请求的操作是从 DNS 解析开始,然后建立连接并发送数据到服务端,随后读取从服务端返回的数据,最后将连接释放。一次网络请求也就结束了。下面就从 DNS 解析开始,看一下都有哪些方面可以做进一步的优化。

DNS 解析优化

1、安全方面

防劫持--考虑使用 HttpDns

注意:HttpDns 只是一个概念,并不是一个现有的开源库。它与传统的 DNS 解析的区别在于 HttpDns 会绕过运行商的 DNS 服务器,直接与 DNS 服务器的 80 端口进行交互,有效地防止域名劫持。

目前已经有第三方厂商提供了实现 httpDns SDK,比较普及的是阿里云和腾讯云的 HttpDns Service。但是这两者的使用具有一定的成本,开发者需要在它们的平台注册并获取开发者 key,并且部分服务是收费的。

对于普通开发者来说,可以考虑使用七牛提供的免费的 happy-dns。实现也比较简单,因为 OkHttp 已经预留了设置 DNS 的接口。如下所示

在接口 Dns 中只有一个 loopup() 方法需要实现,这个方法返回查找到的服务器地址集合,并且 OkHttp 已经实现了一个默认的 Dns 解析器,就是图中红框标注的 SYSTEM。它使用 Java.net 包中的 INetAddress 获取某域名的 IP 地址集合。

我们可以实现 Dns 接口,使用 Http 的请求方式实现自己的域名解析器。具体就是使用七牛提供的 happy-dns sdk 。首先需要添加依赖库

然后在实现的 Dns 类中使用如下方式实现

2、速度方面

关于 Dns 解析的速度方面,我么可以从以下几个方面进行突破。

a. IP 直连方式

这种方式经常在针对不同开发环境的时候使用。比如,针对 qa、staging 的测试环境下,可以直接配置 IP 白名单,跳过 Dns 的解析流程。同样需要实现 OkHttp 的 Dns 接口,如下

有些一线公司也在线上版本采用这种方式 ,但是这种方式开发成本较高。因为 IP 列表是维护在本地,因此需要建立一套 IP 地址的更新机制。另外 IP 直连方式摒弃了 Https 的安全机制,由于 HTTPS 要求证书绑定域名,客户端需要增加额外的代码改造。

b. DNS 解析超时

当我们在做网络请求时,如果网络设备切换路由,访问网络出现长时间无响应。很久之后会抛出 UnknownHostException,并且在 OkHttp 中设置的 connectTimeout 属性对 DNS 的解析不起作用。这种情况,可以在自定义 Dns 中做超时判断,如下所示

具体分析可以参考:Android笔记之解决OkHttp解析dns超时时间无法设置的问题

网络请求缓存优化

实际上有时在做网络请求数据可达优化的时候,经常不可避免的与本地持久化绑定在一起。比如当一次网络请求失败时,我们需要将这次请求保存在本地,并尝试重新发送。或者请求数据成功,需要将数据缓存在本地,当下一次请求数据展示 UI 之前,先将缓存中的数据展示到页面,只有当新的请求返回数据之后,再次刷新页面。

一般做法是创建一个数据库 Entity 类,并根据自家公司的业务逻辑设置公共参数。通常都会有 user_id、update_time 等,如下

上图中 key 表示缓存的标识,插入请求都是根据 key 操作的;value 字段用来保存网络请求的数据。当网络请求成功后,将数据以 JSON 字符串的格式缓存到数据库中。如下所示

图中1处构建 HttpDataCache 类并设置公共参数;图中2处将网络请求数据转换为 Gson 字符串格式;图中3处执行数据操作,将网络请求数据缓存到本地数据库中。

后续当我们再次执行相同 key 的网络请求时,可以先将本地数据库中的数据展示到页面,并进行异步请求操作刷新页面。

幂等性

HTTP 方法的幂等性:一次和多次请求某一个资源应该具有同样的副作用。例如,当点外卖时,服务端和扣款成功后发送给客服端一条扣款成功的消息。但是如果由于网络问题,客户端并没有成功接收到此消息,用户就有可能认为没有付款成功,甚至是尝试再次付款。幂等性就是为例解决这种问题。但是它是属于代码设计层面的技巧,并不是一个实体方法或者开源库。

实现幂等性需要客户端和服务端协同合作实现。比如,原始的付款方法如下

上述方法代表从账户 user_id 中扣除 amount 数量的金额。多次操作就会造成同一个 user_id 账户被扣款多次。可以通过以下方式将付款实现幂等。

create_pay_ticket 是获取一个服务器端生成的唯一处理号 ticket_id。它将用于标识后续的操作。idempotent_pay 和 pay 的区别在于关联了一个 ticket_id。一个 ticket_id 表示的操作至多只会被处理一次,这样付款的操作就符合幂等性了。

实际上,很多 HTTP 请求方法自身就符合幂等性。具体可以参考:理解 HTTP 的幂等性

总结

本次介绍了关于网络优化的几个方向:

1. DNS 解析优化,分安全性和速度提升两方面。

2. 对于请求返回的数据需要缓存到本地数据库中。“发送埋点”的请求失败就将其保存到本地数据库中,当 App 重启或者重新接收到连接网络时,重新尝试发送之前失败的请求。

3. 幂等性在网络架构设计中是一个比较重要的原则。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++类与对象(1)—初步认识

目录 一、面向过程和面向对象 二、类 1、定义 2、类的两种定义方式 3、访问限定符 4、命名规范化 5、类的实例化 6、计算类对象的大小 7、存储方式 三、this指针 1、定义 2、存储位置 3、辨析 四、封装好处 一、面向过程和面向对象 C语言是面向过程的&#xf…

4.6每日一题(多元函数的隐函数求导)

三元方程确定的二元函数类型的隐函数 方法一:两边对x求偏导,把y看成常数 注:z可以把x和y同时代入求出答案 方法二:带公式

Python爬虫教程:从入门到实战

更多Python学习内容:ipengtao.com 大家好,我是涛哥,今天为大家分享 Python爬虫教程:从入门到实战,文章3800字,阅读大约15分钟,大家enjoy~~ 网络上的信息浩如烟海,而爬虫(…

学习指南:如何快速上手媒体生态一致体验开发

过去开发者们在使用多媒体能力时,往往会遇到这样的问题,比如:为什么我开发的相机不如系统相机的效果好?为什么我的应用和其他的音乐一起发声了,我要怎么处理?以及我应该怎么做才能在系统的播控中心里可以看…

计算机组成原理-双端口RAM和多模块存储器

文章目录 存取周期总览双端口RAM多体并行存储器低地址交叉编址有多少个存储体合适(体号)多模块存储器(多体存储器)总结实际场景 存取周期 总览 双端口RAM RAM:用于主存或高速缓存,断电数据丢失 多体并行…

qsort函数使用方法总结

目录 一、qsort函数原型 二、compar参数 三、各种类型的qsort排序 1. int 数组排序 2. 结构体排序 3. 字符串指针数组排序 4. 字符串二维数组排序 四、回调函数 1. 什么是回调函数 2. 为什么要用回调函数? 3. 怎么使用回调函数? 4.下面是…

分支限界法(1)--旅行商问题

一、概述 有n个城市,旅行者要访问所有n个城市,最终回到起始点,假设起始点给定为1,城市间距离已知,求能够完成旅行的最短距离。题干如下图。 算法:分支限界法,使用队列进行bfs搜索。 二、代码 i…

低代码在ERP中的理解与应用:提升开发效率与业务灵活性

企业资源规划(ERP)指通过融合不同部门的信息和流程,提升企业效率、融洽运营的管理体系。ERP系统通过提供一套集成化应用程序,助力企业管理工作流程,包含选购、库存、销售、生产规划等。 低代码(Low-Code&a…

在listener.ora配置文件中配置listener 1527的监听并且使用tnsnames连接测试

文章目录 前言:一、命令语句实现1、监听介绍2、编辑 listener.ora 文件:寻找配置文件对配置文件进行配置 3、重启监听4、配置TNS 二、图形化界面实现1、listener.ora文件配置2、tnsnames.ora文件配置 三、测试连接 前言: 命令实现和图形化实…

遥感数据

在研究中,我们常需要遥感数据。在下面的网站中,可以得到遥感数据。 EarthExplorer (usgs.gov)https://earthexplorer.usgs.gov/登陆网站: 通常,在Additional Criteria中,可以下载遥感数据。 不过,这个选项…

安顿APP3.0全新升级,引领智能穿戴健康革新,专注预警疾病风险

随着人们生活水平的提高和工作压力的增加,心脑血管疾病已经成为现代社会的严重问题,特别是心梗、脑卒中等疾病已经开始夺去年轻人的生命。 据报道,近年来,多位年轻人因心脑血管疾病突发去世,如42岁的知名男演员、30岁的…

【C刷题】day7

🎥 个人主页:深鱼~🔥收录专栏:【C】每日一练🌄欢迎 👍点赞✍评论⭐收藏 一、选择题 1、以下对C语言函数的有关描述中,正确的有【多选】( ) A: 在C语言中,一…

java--拼图游戏

1、了解拼图游戏基本功能: 拼图游戏内容由若干小图像块组成的,通过鼠标点击图像块上下左右移动,完成图像的拼凑。 2、拼图游戏交互界面设计与开发: 通过创建窗体类、菜单、中间面板和左右面板完成设计拼图的交互界面 &#xff…

java 实现串口通讯

1、引入依赖 <dependency><groupId>org.scream3r</groupId><artifactId>jssc</artifactId><version>2.8.0</version> </dependency>2、配置启动串口 Component public class ContextHolder implements ApplicationContextAw…

使用共享内存进行通信的代码和运行情况分析,共享内存的特点(拷贝次数,访问控制),加入命名管道进行通信的代码和运行情况分析

目录 示例代码 头文件(comm.hpp) log.hpp 基础版 -- 服务端 代码 运行情况 加入客户端 代码 运行情况 两端进行通信 客户端 代码 注意点 服务端 代码 两端运行情况 共享内存特点 拷贝次数少 管道的拷贝次数 共享内存的拷贝次数 没有访问控制 管道 共享…

神辅助 Cursor 编辑器,加入 GPT-4 让编码更轻松!

分类 互联网 在 ChatGPT 问世之前&#xff0c;我们的编码方式很多时候都是面向搜索引擎编码&#xff0c;需要不断地进行搜索&#xff0c;然后复制粘贴&#xff0c;俗称复制粘贴工程师。 但是&#xff0c;随着ChatGPT的出现&#xff0c;这一切将彻底改变。 ChatGPT 是一种基于…

AI工具合集

网站&#xff1a;未来百科 | 为发现全球优质AI工具产品而生 (6aiq.com) 如今&#xff0c;AI技术涉及到了很多领域&#xff0c;比如去水印、一键抠图、图像处理、AI图像生成等等。站长之家之前也分享过一些&#xff0c;但是在网上要搜索找到它们还是费一些功夫。 今天发现了一…

STM32 HAL库函数HAL_SPI_Receive_IT和HAL_SPI_Receive的区别

背景 前段时间开发一个按键板驱动&#xff0c;该板用的STM32F103系列单片机&#xff0c;前任工程师用STM32CubeMX生成的工程&#xff0c;里面全是HAL库调用&#xff0c;我接手后&#xff0c;学习了下HAL库的用法&#xff0c;踩坑不少&#xff0c;特别是带IT后缀的函数&#xf…

【左程云算法全讲11】贪心算法 并查集

系列综述&#xff1a; &#x1f49e;目的&#xff1a;本系列是个人整理为了秋招面试的&#xff0c;整理期间苛求每个知识点&#xff0c;平衡理解简易度与深入程度。 &#x1f970;来源&#xff1a;材料主要源于左程云算法课程进行的&#xff0c;每个知识点的修正和深入主要参考…

电子电器架构 —— 车载网关边缘节点总线转换

电子电器架构 —— 车载网关边缘节点路由转发策略 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 PS:小细节,本文字数3000+,详细描述了网关在车载框架中的具体性能设置。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 没有人关注你。也无…