当前位置: 首页 > news >正文

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. 幂等性在网络架构设计中是一个比较重要的原则。

相关文章:

Android---网络编程优化

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

《算法通关村——不简单的字符串转换问题》

《算法通关村——不简单的字符串转换问题》 8. 字符串转换整数 (atoi) 请你来实现一个 myAtoi(string s) 函数,使其能将字符串转换成一个 32 位有符号整数(类似 C/C 中的 atoi 函数)。 函数 myAtoi(string s) 的算法如下: 读入…...

给VSCode插上一双AI的翅膀

#AI编程助手哪家好?DevChat“真”好用# 文章目录 前言一、安装DevChat1.1、访问地址1.2、注册1.3、在VSCode里安装DevChat插件1.3.1、未安装状态1.3.2、已安装状态 二、设置Access Key2.1. 点击左下角管理(“齿轮”图标)—命令面板&#xff…...

2023年亚太杯数学建模思路 - 案例:异常检测

文章目录 赛题思路一、简介 -- 关于异常检测异常检测监督学习 二、异常检测算法2. 箱线图分析3. 基于距离/密度4. 基于划分思想 建模资料 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 一、简介 – 关于异常…...

机器学习的医疗乳腺癌数据的乳腺癌疾病预测

项目视频讲解:基于机器学习的医疗乳腺癌数据的乳腺癌疾病预测 完整代码数据分享_哔哩哔哩_bilibili 效果演示: 代码: #第一步!导入我们需要的工具 import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sns %matplotlib inlin…...

解析:什么是生成式AI?与其他类型的AI有何不同?

原创 | 文 BFT机器人 快速浏览一下头条新闻,你会发现生成式AI似乎无处不在。事实上,一些新闻标题甚至可能是通过生成式AI编写的,例如OpenAI旗下的ChatGPT,这个聊天机器人已经展现出了生成看起来像人类所写文本的惊人能力。 当人们…...

国产化项目改造:使用达梦数据库和东方通组件部署,前后端分离框架

前提&#xff1a;前后端分离前后端包都要用war包。 1、springboot后端改变war包 pom文件添加 <packaging>war</packaging>添加依赖&#xff0c;并且支持tomcat<!-- war包 --><dependency><groupId>org.springframework.boot</groupId><…...

Nginx实现负载均衡

Nginx实现负载均衡 负载均衡的作用 1、解决单点故障&#xff0c;让web服务器构成一个集群 2、将请求平均下发给后端的web服务器 负载均衡的软硬件介绍 负载均衡软件&#xff1a; # nginx 四层负载均衡&#xff1a;stream&#xff08;nginx 1.9版本以后有stream模块&#x…...

SpringCloud 2022有哪些变化

目录 前提条件 AOT支持 Spring Native支持 前提条件 Spring Cloud 2022.0.0是构建在Spring Framework 6.0和Spring Boot 3.0 之上的一S个主要版本。 JDK要求最低需要是Java 17J2EE要求最低需要Jakarta EE 9 AOT支持 Spring cloud 2022支持AOT编译&#xff0c;它是将程序源…...

如何快速本地搭建悟空CRM结合内网穿透工具高效远程办公

&#x1f308;个人主页&#xff1a;聆风吟 &#x1f525;系列专栏&#xff1a;数据结构、Cpolar杂谈 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 &#x1f4cb;前言一. 无需公网IP&#xff0c;使用cpolar实现悟空CRM远程访问二. 通过公网来访问公司…...

Docker打包Python项目

1. 简介 Docker是一种开源的容器化平台&#xff0c;可以将应用程序及其依赖项打包到一个轻量级、可移植的容器中。通过使用Docker&#xff0c;可以简化Python项目的部署和运行&#xff0c;提高开发效率和应用程序的可移植性。 本文将介绍如何使用Docker来打包Python项目。我们…...

【Java并发编程一】并发与并行

为什么引入并发 摩尔定理逐渐失效&#xff0c;单核性能很难提升&#xff0c;通过组合多核性能来进一步满足实际需要&#xff0c;从而引入并发编程。在大部分场景下&#xff0c;并行是由于串行的&#xff0c;并行可以优化非关键节点的时间消耗。 并发的三大特性 原子性  某个…...

MFC/QT 一些快忘记的细节:

1&#xff1a;企业应用中&#xff0c;MFC平台除了用常见的对话框模式还有一种常用的就是单文档模式&#xff0c; 维护别人的代码&#xff0c;不容易区分,看它与程预序认同名cpp&#xff0c;就知道了&#xff0c;比如项目名称为 DoCMFCDemo&#xff0c;那么就看BOOL CDocMFCDe…...

在服务器上部署MVC 6应用程序

在服务器上成功部署MVC 6应用程序&#xff08;现在更为称为ASP.NET Core MVC&#xff09;涉及一系列步骤。以下是一般的指导步骤&#xff1a; 1. 准备服务器环境&#xff1a; - 确保服务器上安装了.NET Core Runtime和.NET Core SDK。可以从[.NET下载页面](https://dotnet.mi…...

golang学习笔记——斐波纳契数列

斐波纳契数列 编写一个程序来计算某个数字的斐波纳契数列。 斐波那契数列是一个数字列表&#xff0c;其中每个数字是前两个斐波那契数字之和。 例如&#xff0c;数字 6 的序列是 1,1,2,3,5,8&#xff0c;数字 7 的序列是 1,1,2,3,5,8,13&#xff0c;数字 8 的序列是 1,1,2,3,5…...

学习raft协议(1)

CAP C: 一致性 强调数据的正确性&#xff0c;每次读操作&#xff0c;要么读到最新&#xff0c;要么读失败 A:可用性 不发生错误&#xff0c;也不能出现过长的等待时间. P:分区容错性 在网络环境不可靠的背景下&#xff0c;整个系统仍然是正常运作的两种流派 &#xff08;1&am…...

SpringSecurity+jwt使用

参考文章链接 自定义SpringSecurity用户 package com.daben.springsecurityjwt.vo;import com.daben.springsecurityjwt.entity.SysUser; import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.userdetails.User; import j…...

html-网站菜单-点击显示导航栏

一、效果图 1.点击显示菜单栏&#xff0c;点击x号关闭&#xff1b; 2.点击一级菜单&#xff0c;展开显示二级&#xff0c;并且加号变为减号&#xff1b; 3.点击其他一级导航&#xff0c;自动收起展开的导航。 二、代码实现 <!DOCTYPE html> <html><head>&…...

【C++函数的进化】函数指针,模板,仿函数,lambda表达式

/*** poject * author jUicE_g2R(qq:3406291309)* file C函数的进化* * language C* EDA Base on VS2022* editor Obsidian&#xff08;黑曜石笔记软件&#xff09;* * copyright 2023* COPYRIGHT 原创学习笔记&#xff1a;转载需获得博…...

云服务器windows service2022 部署git服务器

1 安装 下载地址gitblit 解压到你的一个目录,我这里给的是C:\gitblit 根据官网提示要下载jre or jdk7.0,这里建议使用下载jre (jdk 有时候运行出问题,或者2个都安装),自行安装java,这里不做环境配置的说明 进入c:\gitblit\data 目录里面找到,defaults.properties 文件,编辑主…...

Linux_Docker修改Docker Root Dir

今天遇到需求&#xff0c;要修改一下docker容器和镜像的存储位置&#xff0c;默认位置为/var/lib/docker目录下&#xff0c;要修改到/new/dockerFile目录下。 停止docker服务 sudo service docker stop 备份docker容器镜像 移动/var/lib/docker目录下的文件到/dockerFile目录…...

解决requests 2.28.x版本SSL错误:证书验证失败

1、问题背景 在使用requests 2.28.1版本时&#xff0c;我进行HTTP post传输报告负载时&#xff0c;由于SSL验证设置为True&#xff0c;请求失败&#xff0c;错误如下&#xff1a;(Caused by SSLError(SSLCertVerificationError(1, ‘[SSL: CERTIFICATE_VERIFY_FAILED] certifi…...

【开源】基于Vue.js的开放实验室管理系统的设计和实现

项目编号&#xff1a; S 013 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S013&#xff0c;文末获取源码。} 项目编号&#xff1a;S013&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、研究内容2.1 实验室类型模块2.2 实验室模块2.3 实…...

使用composer安装ffmpeg的步骤

以下是使用composer安装ffmpeg的步骤&#xff1a; 1.在laravel根目录下执行以下命令安装ffmpeg&#xff1a; composer require php-ffmpeg/php-ffmpeg 2.如果不指定版本号&#xff0c;则默认使用0.14版本。 3.执行以上命令后&#xff0c;composer会自动下载并安装ffmpeg。 …...

RT-DETR优化策略:轻量级Backbone改进 | 高效模型 (Efficient MOdel, EMO),现代倒残差移动模块设计|ICCV2023

🚀🚀🚀本文改进:面向移动端的轻量化网络模型——EMO,它能够以相对较低的参数和 FLOPs 超越了基于 CNN/Transformer 的 SOTA 模型,支持四个版本EMO_1M, EMO_2M, EMO_5M, EMO_6M,参数量如下,相对于自带的rtdetr-l、rtdetr-x有很大提升 layersparametersgradientsEMO_1…...

一些nginx命令

1.停止nginx nginx -s quit systemctl stop nginx.service 立即停止 nginx-s stop 杀死nginx进程 killall nginx 2.启动命令 nginx systemctl start nginx.service 3.查看nginx进程 ps aux | grep nginx 4.重启nginx服务 systemctl restart nginx.service 5.重载…...

WPF自定义控件介绍

在WPF中&#xff0c;自定义控件通常是指从头开始创建一个新控件或从现有控件继承并扩展其功能。自定义控件与用户控件&#xff08;User Control&#xff09;不同&#xff0c;用户控件是通过组合其他控件来构建的&#xff0c;而自定义控件通常涉及对控件的更底层的渲染和行为进行…...

JUNIT使用和注意、以及断言的介绍使用、SpringBoot Test测试类的使用、maven配置使用junit详细介绍

参考文章&#xff1a; https://www.cnblogs.com/zhukaile/p/14514238.html&#xff0c;https://blog.csdn.net/qq_36448800/article/details/126438339 一、什么是单元测试 在平时的开发当中&#xff0c;一个项目往往包含了大量的方法&#xff0c;可能有成千上万个。如何去保…...

强化学习在文生图中的应用:Training Diffusion Models with Reinforcement Learning

论文链接:Training Diffusion Models with Reinforcement Learning项目地址:Training Diffusion Models with Reinforcement Learning官方代码:https://github.com/kvablack/ddpo-pytorch/tree/maintrl实现:https://huggingface.co/docs/trl/ddpo_trainer🤗关注公众号 fu…...

【C语言】数组下标为啥从0开始?下标越界访问一定报错吗?

本篇文章目录 0. 相关文章1. 下标从0开始问题2. 数组下标越界不报错问题 0. 相关文章 指针与指针变量数组名不是首元素地址的的2个例外拨开指针和数组名之间的迷雾 1. 下标从0开始问题 原因是&#xff1a;数组下标访问本质是“指针解引用操作”&#xff0c;而指针又是地址&am…...