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

深入解析OkHttp与Retrofit:Android网络请求的黄金组合

前言

在移动应用开发中,网络请求是连接客户端与服务器的关键桥梁。对于Android开发者而言,OkHttp和Retrofit这对组合已经成为处理网络请求的事实标准。本文将全面剖析这两个框架的设计理念、核心功能、协同关系以及最佳实践,帮助开发者构建高效、可靠的网络通信层。

一、OkHttp:强大的HTTP引擎

1.1 核心定位与优势

OkHttp是由Square公司开发的一个高效的HTTP客户端,其主要优势包括:

• 连接复用:通过连接池减少TCP握手开销

• 透明压缩:自动处理GZIP压缩

• 缓存机制:减少重复网络请求

• 自动重试:对失败的连接进行智能恢复

• 拦截器链:灵活的请求/响应处理机制

1.2 基础使用示例

// 创建OkHttpClient实例
OkHttpClient client = new OkHttpClient.Builder().connectTimeout(10, TimeUnit.SECONDS).readTimeout(30, TimeUnit.SECONDS).build();// 构建请求
Request request = new Request.Builder().url("https://api.example.com/data").header("Authorization", "Bearer token").build();// 异步请求
client.newCall(request).enqueue(new Callback() {@Overridepublic void onFailure(Call call, IOException e) {// 处理网络错误}@Overridepublic void onResponse(Call call, Response response) throws IOException {if (!response.isSuccessful()) {// 处理服务器错误}// 处理响应数据String responseData = response.body().string();}
});

1.3 拦截器机制详解

OkHttp的拦截器是其最强大的特性之一,允许开发者对请求和响应进行链式处理:

public class AuthInterceptor implements Interceptor {@Overridepublic Response intercept(Chain chain) throws IOException {Request originalRequest = chain.request();// 添加认证头Request authenticatedRequest = originalRequest.newBuilder().header("Authorization", "Bearer " + getAccessToken()).build();Response response = chain.proceed(authenticatedRequest);// Token过期时自动刷新if (response.code() == 401) {refreshToken();authenticatedRequest = originalRequest.newBuilder().header("Authorization", "Bearer " + getNewAccessToken()).build();return chain.proceed(authenticatedRequest);}return response;}
}

二、Retrofit:类型安全的API客户端

2.1 设计哲学与核心价值

Retrofit是构建在OkHttp之上的REST API客户端库,其主要特点包括:

• 声明式API:通过接口定义网络请求

• 自动序列化:支持JSON、XML等多种数据格式

• 多适配器支持:兼容RxJava、协程等异步编程模型

• 线程管理:自动处理IO与主线程切换

2.2 基础配置与使用

// 创建Retrofit实例
Retrofit retrofit = new Retrofit.Builder().baseUrl("https://api.example.com/").client(new OkHttpClient.Builder().build()).addConverterFactory(GsonConverterFactory.create()).addCallAdapterFactory(RxJava2CallAdapterFactory.create()).build();// 定义API接口
public interface GitHubService {@GET("users/{user}/repos")Observable<List<Repo>> listRepos(@Path("user") String user);@POST("users/new")@FormUrlEncodedObservable<User> createUser(@Field("name") String name,@Field("email") String email);
}// 创建服务实例
GitHubService service = retrofit.create(GitHubService.class);

三、OkHttp与Retrofit的协同关系

3.1 架构层级与分工

[应用业务层]││ 业务逻辑调用▼
[Retrofit适配层]│   ├── API接口定义│   ├── 参数序列化│   ├── 响应转换│   └── 线程调度││ HTTP协议转换▼
[OkHttp引擎层]│   ├── 连接管理│   ├── 请求执行│   ├── 缓存处理│   └── 拦截器链│▼
[TCP/IP协议栈]

3.2 功能对比与互补

功能维度OkHttpRetrofit
抽象层级底层HTTP协议操作高层业务API抽象
数据转换原始字节流处理自动对象序列化/反序列化
线程模型需手动线程切换自动线程调度
代码风格命令式声明式
最佳适用场景文件上传下载、WebSocketREST API请求

3.3 协同工作流程

  1. 请求发起阶段:
    • Retrofit将接口方法转换为HTTP请求定义

    • 通过Converter将参数对象序列化为请求体

    • 调用OkHttp创建实际请求

  2. 请求执行阶段:
    • OkHttp管理TCP连接池

    • 执行拦截器链(认证、日志等)

    • 处理重定向和重试逻辑

  3. 响应处理阶段:
    • OkHttp接收原始响应数据

    • Retrofit通过Converter将响应体反序列化为对象

    • 通过CallAdapter适配不同的异步模型

四、调用方式深度解析

4.1 原生Call方式

适用场景:
• 简单请求场景

• 无复杂异步需求

• 需要精细控制请求生命周期

示例代码:

// 接口定义
public interface ApiService {@GET("user/{id}")Call<User> getUser(@Path("id") String userId);
}// 请求执行
Call<User> call = apiService.getUser("123");
call.enqueue(new Callback<User>() {@Overridepublic void onResponse(Call<User> call, Response<User> response) {// 处理响应}@Overridepublic void onFailure(Call<User> call, Throwable t) {// 处理错误}
});

4.2 RxJava方式

适用场景:
• 复杂异步操作组合

• 需要响应式编程支持

• 已有RxJava技术栈的项目

优势:
• 丰富的操作符(map、flatMap、zip等)

• 便捷的线程调度

• 强大的错误处理能力

示例代码:

// 组合多个请求
apiService.getUser("123").flatMap(user -> apiService.getFriends(user.id)).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(friends -> {// 更新UI}, throwable -> {// 统一错误处理});

4.3 协程方式

适用场景:
• Kotlin项目

• 现代Android架构(ViewModel+Repository)

• 需要简化异步代码

优势:
• 顺序式编程模型

• 结构化并发

• 与Jetpack组件完美集成

示例代码:

// 接口定义
@GET("user/{id}")
suspend fun getUser(@Path("id") userId: String): User// ViewModel中使用
viewModelScope.launch {try {val user = repository.getUser("123")val friends = repository.getFriends(user.id)_uiState.value = UiState.Success(user to friends)} catch (e: Exception) {_uiState.value = UiState.Error(e)}
}

五、高级特性与最佳实践

5.1 统一错误处理

public class GlobalErrorHandler implements Interceptor {@Overridepublic Response intercept(Chain chain) throws IOException {Request request = chain.request();Response response = chain.proceed(request);if (!response.isSuccessful()) {ErrorResponse error = parseError(response);switch (error.code) {case 401:throw new AuthException(error.message);case 500:throw new ServerException(error.message);default:throw new ApiException(error.message);}}return response;}
}

5.2 动态BaseUrl管理

public class DynamicBaseUrlInterceptor implements Interceptor {private String baseUrl;public void setBaseUrl(String baseUrl) {this.baseUrl = baseUrl;}@Overridepublic Response intercept(Chain chain) throws IOException {Request originalRequest = chain.request();HttpUrl newUrl = HttpUrl.parse(baseUrl).resolve(originalRequest.url().encodedPath());Request newRequest = originalRequest.newBuilder().url(newUrl).build();return chain.proceed(newRequest);}
}

5.3 文件下载进度监听

public class ProgressInterceptor implements Interceptor {private ProgressListener listener;public ProgressInterceptor(ProgressListener listener) {this.listener = listener;}@Overridepublic Response intercept(Chain chain) throws IOException {Request request = chain.request();Response originalResponse = chain.proceed(request);return originalResponse.newBuilder().body(new ProgressResponseBody(originalResponse.body(), listener)).build();}
}public class ProgressResponseBody extends ResponseBody {// 实现进度回调逻辑
}

六、性能优化指南

6.1 连接池优化配置

new OkHttpClient.Builder().connectionPool(new ConnectionPool(5, // 最大空闲连接数5, // 保持时间TimeUnit.MINUTES)).build();

6.2 DNS优化策略

public class CustomDns implements Dns {@Overridepublic List<InetAddress> lookup(String hostname) {if (hostname.equals("api.myapp.com")) {// 返回优选IP地址return Arrays.asList(InetAddress.getByName("1.2.3.4"));}return Dns.SYSTEM.lookup(hostname);}
}

6.3 缓存策略配置

Cache cache = new Cache(new File(context.getCacheDir(), "http_cache"),50 * 1024 * 1024); // 50MB缓存OkHttpClient client = new OkHttpClient.Builder().cache(cache).addNetworkInterceptor(new CacheInterceptor()).build();

七、常见问题与解决方案

Q1:如何选择网络请求库?

• 简单项目:原生HttpURLConnection

• 中等复杂度:纯OkHttp

• API密集型:Retrofit + OkHttp组合

• 特殊需求:根据场景选择(如WebSocket、HTTP/2等)

Q2:如何处理SSL证书问题?

// 创建不验证证书的Client
OkHttpClient insecureClient = new OkHttpClient.Builder().sslSocketFactory(getInsecureSSLSocketFactory(), getTrustManager()).hostnameVerifier((hostname, session) -> true).build();

Q3:如何实现文件断点续传?

// 添加Range头
Request request = new Request.Builder().url(fileUrl).header("Range", "bytes=" + downloadedLength + "-").build();

结语

OkHttp与Retrofit的组合为Android开发者提供了强大而灵活的网络通信解决方案。通过本文的系统性介绍,相信您已经掌握了从基础使用到高级特性的全面知识。在实际项目中,建议:

  1. 根据项目规模和技术栈选择合适的调用方式
  2. 合理应用拦截器实现统一逻辑
  3. 关注性能优化点,特别是连接管理和缓存策略
  4. 遵循安全最佳实践,特别是认证和加密相关处理

网络请求作为App的"生命线",其稳定性和性能直接影响用户体验。希望本文能帮助您构建更加健壮、高效的网络通信层,为应用质量保驾护航。

相关文章:

深入解析OkHttp与Retrofit:Android网络请求的黄金组合

前言 在移动应用开发中&#xff0c;网络请求是连接客户端与服务器的关键桥梁。对于Android开发者而言&#xff0c;OkHttp和Retrofit这对组合已经成为处理网络请求的事实标准。本文将全面剖析这两个框架的设计理念、核心功能、协同关系以及最佳实践&#xff0c;帮助开发者构建高…...

Python操作PDF书签详解 - 添加、修改、提取和删除

目录 简介 使用工具 Python 向 PDF 添加书签 添加书签 添加嵌套书签 Python 修改 PDF 书签 Python 展开或折叠 PDF 书签 Python 提取 PDF 书签 Python 删除 PDF 书签 简介 PDF 书签是 PDF 文件中的导航工具&#xff0c;通常包含一个标题和一个跳转位置&#xff08;如…...

Spring Boot与Kafka集成实践:从入门到实战

Spring Boot与Kafka集成实践 引言 在现代分布式系统中&#xff0c;消息队列是不可或缺的组件之一。Apache Kafka作为一种高吞吐量的分布式消息系统&#xff0c;广泛应用于日志收集、流处理、事件驱动架构等场景。Spring Boot作为Java生态中最流行的微服务框架&#xff0c;提供…...

luckysheet的使用——17.将表格作为pdf下载到本地

luckysheet源码里面自带有打印按钮&#xff0c;但是功能是无法使用的&#xff0c;所以我把该功能重写了一遍 1.在menuButton.js文件中找到源码打印按钮的触发事件&#xff1a; $("#luckysheet-icon-print").click(function () {}2.使用自己写的挂载方法 window.pr…...

矿井支架LCYVB-6钢丝编织护套连接器介绍

LCYVB-6钢丝编织护套连接器是一种专为矿井支架设计的连接装置&#xff0c;主要用于增强支架的稳定性和安全性。该连接器采用高强度钢丝编织护套&#xff0c;具有优异的抗拉强度和耐磨性&#xff0c;适用于恶劣的矿井环境。 主要特点 高强度钢丝编织护套&#xff1a;采用优质钢…...

git仓库中.git 文件很大,怎么清理掉一部分

查询 .git 文件大小&#xff0c;在 git-bash 里执行&#xff08;后面有些命令不能执行&#xff0c;也请在 git-bash 里执行&#xff09; windows11 安装好后右键没有 git bash 命令-CSDN博客 du -sh .git // 592m .git 操作前最好先备份一份&#xff0c;避免推送到远程时出错…...

Qt框架核心组件完全指南:从按钮交互到定时器实现

文章目录 前言一、QAbstractButton 按钮类概述1.1 常用属性1.2 常用信号1.3QButtonGroup 按钮组 二、QComboBox 组合框三、若干与数字相关的组件四、QString 字符串类五、Qt容器类5.1 顺序容器 QList5.2 关联容器 QMap 六、QVariant七、跨平台数据类型7.1 基础数据类型7.2 特殊…...

Axure设计数字乡村可视化大屏:从布局到交互的实战经验分享

乡村治理正从传统模式向“数据驱动”转型。数字乡村可视化大屏作为数据展示的核心载体&#xff0c;不仅能直观呈现乡村发展全貌&#xff0c;还能为决策提供科学依据。本文以Axure为工具&#xff0c;结合实际案例&#xff0c;分享如何从零设计一个功能完备、交互流畅的数字乡村大…...

60天python训练计划----day30

DAY 30 模块和库的导入 知识点回顾&#xff1a; 导入官方库的三种手段导入自定义库/模块的方式导入库/模块的核心逻辑&#xff1a;找到根目录&#xff08;python解释器的目录和终端的目录不一致&#xff09; 一.导入官方库 我们复盘下学习python的逻辑&#xff0c;所谓学习pyth…...

HJ3 明明的随机数【牛客网】

文章目录 零、原题链接一、题目描述二、测试用例三、解题思路3.1 快排去重3.2 散列 四、参考代码4.1 快排去重4.2 散列 零、原题链接 HJ3 明明的随机数 一、题目描述 二、测试用例 三、解题思路 3.1 快排去重 基本思路&#xff1a;   先将序列进行快速排序&#xff0c;然后…...

BGP选路

一、拓扑图 二、要求及分析 1.要求 1.使用Preva1策略&#xff0c;确保R4通过R2到达192.168.10.0/24 2、用As Path策略&#xff0c;确保R4通过R3到达192.168.11.0/24 3.配置MED策略&#xff0c;确保R4通过R3到达192.168.12.0/24 4.使用Local Preference策略&#xff0c;确保…...

践行“科学智能”!和鲸打造 AI for Science 专属应用

AI for good, AI for Science. 在传统科研领域&#xff0c;人力与经验的局限始终如影随形。而“AI for Science”正逐渐改变科学研究的模式&#xff0c;以科学数据为基石、以强大算力为支撑&#xff0c;借助人工智能技术&#xff0c;开展计算密集度高且能够实现高效迭代的科学…...

【vs2022的C#窗体项目】打开运行+sql Server改为mysql数据库+发布

1. vs2022打开运行原sql Server的C#窗体项目更改为mysql数据库 1.1. vs2022安装基础模块即可 安装1️⃣vs核心编辑器2️⃣.net桌面开发必选&#xff0c;可选均不安装&#xff01;&#xff01;&#xff01; 为了成功连接mysql数据库&#xff0c;需要安装组件NuGet包管理器 安…...

wpf DataGrid 行选择事件

在WPF中处理DataGrid行选择事件主要有以下几种实现方式: 1.SelectionChanged事件处理 ‌ 通过直接订阅DataGrid的SelectionChanged事件实现行选择响应: <DataGrid SelectionChanged="DataGridAccurateLocationList_SelectionChanged" .../>后台代码中处理…...

Spring Cloud Seata 深度解析:原理与架构设计

文章目录 前言&#xff1a;为什么我们需要理解分布式事务&#xff1f;一、Seata 核心架构深度拆解1.1 分布式事务核心模型1.2 Seata undo_log 存储结构与版本控制存储结构版本控制核心算法 1.3 Seata 事务模型深度对比与实现原理AT 模式&#xff08;Auto Transaction&#xff0…...

从产品展示到工程设计:3DXML 转 STP 的跨流程数据转换技术解析

在数字化设计与制造领域&#xff0c;不同格式的三维模型文件常常需要进行转换&#xff0c;以满足不同软件和工作流程的需求。3DXML 和 STP&#xff08;STEP AP214/AP242&#xff09;是工业领域常用的两种三维模型文件格式&#xff0c;3DXML 格式以其轻量化和便于网络传输、可视…...

基于RT-Thread的STM32F4开发第五讲——软件模拟I2C

文章目录 前言一、RT-Thread工程创建二、AT24C02三、函数编写1.I2C_soft.c2.I2C_soft.h3.main.h 四、效果展示五、资源分享总结 前言 本章是基于RT-Thread studio实现软件模拟I2C&#xff0c;开发板是正点原子的STM32F4探索者&#xff0c;使用的RT-Thread驱动是5.1.0&#xff0…...

pkucpc2025 L:Game on Tree

题意 两个人在一棵无根树上玩游戏&#xff0c;每次可以删掉若干个叶子节点&#xff0c;不能操作的人输。 思路 比赛的时候我去写H Quintuple了&#xff0c;队友貌似在我写的时候把这道题讨论出来了。 后来补题的时候花了大概花了70分钟左右ac这道题。 首先考虑一条链的情况…...

大数据实时分析:ClickHouse、Doris、TiDB 对比分析

随着企业对数据分析实时性、复杂性和多样性的要求越来越高,传统的批处理数仓已经无法满足实时指标看板、流量监控、用户行为分析等场景需求。因此,越来越多的公司开始引入实时分析型数据库系统。 目前,国内外常见的实时分析数据库有: ClickHouse:列式数据库,极致的分析性…...

网络流量分析系统的十大应用场景

在现代企业和组织的IT运维体系中&#xff0c;网络流量分析系统&#xff08;Network Traffic Analysis, NTA&#xff09;早已不仅仅是用来查看带宽使用率的“流量计数器”。随着网络环境的复杂化、攻击技术的不断演进&#xff0c;以及对业务连续性要求的提升&#xff0c;网络流量…...

问题 | 代码审查:函数是否包含返回语句

“函数是否包含返回语句”这一问题的核心是&#xff1a;在编程中&#xff0c;函数是否按照设计要求正确使用了 返回语句&#xff08;如 return、return value&#xff09;&#xff0c;以便向调用者传递结果或控制权。以下是详细解释&#xff1a; 1. 什么是函数的返回语句&#…...

Spring Bean 生命周期中设计模式的应用与解析

Spring Bean 生命周期中使用的设计模式 Spring Bean 的生命周期涉及多个阶段和扩展点&#xff0c;Spring 框架在这一过程中巧妙运用了多种设计模式&#xff0c;以实现强大的功能和灵活性。以下是主要设计模式及其应用场景&#xff1a; 1. 工厂模式&#xff08;Factory Patter…...

设计模式的原理及深入解析

创建型模式 创建型模式主要关注对象的创建过程&#xff0c;旨在通过不同的方式创建对象&#xff0c;以满足不同的需求。 工厂方法模式 定义&#xff1a;定义一个创建对象的接口&#xff0c;让子类决定实例化哪一个类。 解释&#xff1a;工厂方法模式通过定义一个创建对象的…...

kotlin flow的两种SharingStarted策略的区别

一 两种 SharingStarted 策略的区别&#xff1a; SharingStarted.Eagerly: 立即开始收集上游流&#xff0c;即使没有下游订阅者持续保持活跃状态&#xff0c;直到 ViewModel 被清除优点&#xff1a;响应更快&#xff0c;数据始终保持最新缺点&#xff1a;消耗更多资源&#x…...

BGP综合实验(2)

一、实验需求 1、实验拓扑图 2、实验需求 使用 PreVal 策略&#xff0c;让 R4 经 R2 到达 192.168.10.0/24 。 使用 AS_Path 策略&#xff0c;让 R4 经 R3 到达 192.168.11.0/24 。 配置 MED 策略&#xff0c;让 R4 经 R3 到达 192.168.12.0/24 。 使用 Local Preference 策…...

python使用jsonpath-ng库操作json数据

jsonpath-ng 库的详细使用如下&#xff1a; 一、安装与导入 安装 通过 pip 安装库&#xff1a; pip install jsonpath-ng支持 Python 3.6 及以上版本。 导入核心模块 主要使用 parse 函数和 JSONPath 对象&#xff1a; from jsonpath_ng import parse二、基础查询操作 1. 简单…...

通用简洁工作汇报项目评估营销策划工作总结年终汇报PPT模版8套一组分享

工作总结汇报PPT模版8套一组分享&#xff1a;工作总结汇报PPT模版分享https://pan.quark.cn/s/04b7ab7a47c4 第一套PPT模版&#xff0c;主要是黄色和灰色调&#xff0c;上方有大面积黄色不规则形状背景&#xff0c;有“POWERPOINT”和“XXXXPPT模版”字样&#xff0c;左侧是黑…...

掌握Git:版本控制与高效协作指南

一、初始Git 提出问题&#xff1a;无论是在工作还是学习&#xff0c;我们在编写各种文档的时候&#xff0c;更改失误&#xff0c;失误后恢复到原来版本&#xff0c;不得不复制出一个副本。 每个版本由各自的内容&#xff0c;但最终只有一个报告需要被我们使用。 但在此之前的…...

ubuntu下配置vscode生成c_cpp_properties.json

-------------学习记录--------------- 在ubuntu下使用vscode时发现cpp文件无法读到头文件&#xff0c;明明头文件在合适的路径下&#xff0c;由于没有制定头文件的路径造成的这个问题。用这篇文章进行简单记录解决方法 ctrlshiftp打开命令面板&#xff0c;也可以点击左上角, …...

Qt读取Excel文件的技术实现与最佳实践

目录 一、成果展示二、核心方法及原理1. QAxObject&#xff08;基于COM接口&#xff09;2. 第三方库QXlsx3. ODBC数据库驱动 三、实现步骤详解1. QAxObject读取Excel&#xff08;需安装Excel/WPS&#xff09;2. QXlsx读取Excel&#xff08;跨平台方案&#xff09; 四、技术选型…...

双条件拆分工作表,一键生成独立工作簿-Excel易用宝

你是否遇到过这样的崩溃瞬间&#xff1f;面对一张密密麻麻的销售数据表&#xff0c;需要按指定维度拆分成工作簿和工作表&#xff0c;而你却只能手动复制粘贴到不同工作簿、工作表&#xff0c;改一个字段就花半小时&#xff0c;数据量大时甚至要熬夜加班&#xff1f; 别担心&a…...

iOS 蓝牙开发中的 BT 与 BLE

在 iOS 开发者的语境里,大家把 BT 和 BLE 当成两种不同的蓝牙技术在谈——它们来自同一个 Bluetooth 规范,但面向的场景、协议栈乃至 Apple 提供的 API 都截然不同。 缩写全称 / 技术名称规范层叫法iOS 支持现状典型用途BTBluetooth Classic(经典蓝牙)又叫 BR/EDR(Basic R…...

TCP和套接字SSL加密连接行为分析

目录 一、前言 二、背景 三、参数介绍 3.1、 have_openssl 3.2、have_ssl 3.3、require_secure_transport 四、--ssl-modemode 五、CREATE USER SSL/TLS选项 六、问题验证 6.1、使用套接字连接 6.2、使用TCP连接 七、分析与总结 一、前言 SSL&#xff08;Secure S…...

kafka 问与答

kafka Q&A How does the client connect to kafka and discovery the brokers. client 只需要知道一部分nodes(brokers)的地址既可以&#xff0c;client 会自动发现剩下的所有topic partition leader nodes, 然后连接上。 When a client connects:It uses the bootstrap…...

docker默认存储迁移

在容器化场景下默认存储路径为&#xff08;/var/lib/docker&#xff09;大多数平台根目录不支持系统盘扩容&#xff0c;会有空间不足风险隐患&#xff0c;因未配置持久化存储导致容器数据丢失。以迁移Docker存储路径至大容量/data目录说明 一、停止容器 systemctl stop docke…...

Ubuntu20.04系统下使用交叉编译工具链(aarch、x86)交叉编译opencv4.5.0

文章目录 0. 引言1. 准备交叉编译工具链2. 安装依赖工具3. 下载 OpenCV 源码4. 创建交叉编译工具链文件5. 配置 CMake 构建6. 构建 OpenCV7. 安装 OpenCV8. 验证9. 问题及解决办法 0. 引言 Ubuntu20.04系统下使用交叉编译工具链&#xff08;aarch、x86&#xff09;交叉编译ope…...

R语言数据可视化

R note book 文档–输出html格式文档&#xff0c;plotly不能生成PDF文件 --- title: "R语言数据可视化" output: html_notebook ---在R语言中进行数据可视化是数据分析和呈现的重要环节&#xff0c;R提供了多种强大的绘图系统和工具。以下是常见的数据可视化方法和示…...

NLP学习路线图(一): 线性代数(矩阵运算、特征值分解等)

引言&#xff1a;语言与矩阵的奇妙邂逅 在自然语言处理&#xff08;NLP&#xff09;的魔法世界里&#xff0c;每个词语都像被施了变形术的精灵&#xff0c;在数学的殿堂中翩翩起舞。当我们用"king - man woman queen"这样的向量魔法破解语义密码时&#xff0c;线性…...

【滑动窗口】LeetCode 1004题解 | 最大连续1的个数 Ⅲ

最大连续1的个数 Ⅲ 一、题目链接二、题目三、题目解析四、算法原理解法一&#xff1a;暴力枚举 zero计数器解法二&#xff1a;滑动窗口 五、编写代码六、时空复杂度 一、题目链接 最大连续1的个数 Ⅲ 二、题目 三、题目解析 注意题目中说的是最多k次&#xff0c;在一个数组…...

Linux 内核等待机制详解:prepare_to_wait_exclusive 与 TASK_INTERRUPTIBLE

1. prepare_to_wait_exclusive 函数解析 1.1 核心作用 prepare_to_wait_exclusive 是 Linux 内核中用于将进程以独占方式加入等待队列的关键函数,其主要功能包括: 标记独占等待:通过设置 WQ_FLAG_EXCLUSIVE 标志,表明此等待条目是独占的。 安全入队:在自旋锁保护下,将条…...

分布式数据库TiDB:深度解析原理、优化与架构设计

&#x1f482; 个人网站:【 摸鱼游戏】【神级代码资源网站】【星海网址导航】 一、TiDB架构设计与核心原理 1.1 分布式架构演进 传统分库分表 vs TiDB架构 #mermaid-svg-8I88Hg2AVkzYTb3O {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fi…...

【深度学习基础】损失函数与优化算法详解:从理论到实践

【深度学习基础】损失函数与优化算法详解&#xff1a;从理论到实践 一、引言 1. 损失函数与优化算法在深度学习中的核心作用 在深度学习中&#xff0c;模型训练的本质是通过不断调整参数&#xff0c;使模型输出尽可能接近真实值。这一过程的核心驱动力是损失函数&#xff08;…...

睿抗足球机器人

目录 大框架 战术 Lua脚本语言编辑环境 大框架 策略脚本&#xff08;LUA-官方脚本&#xff09;、决策算法&#xff08;C-自定义&#xff09;、ROS系统 战术 我们研究了场地的长度、宽度、禁区范围、机器人运动速度等等&#xff0c;发现即使 Kicker 点球往极端角度踢&#xf…...

助力DBA技能无缝平迁 | YashanDB携最新成果亮相XCOPS智能运维管理人年会

5 月 16 日&#xff0c;由上海市软件行业协会、上海市计算机行业协会指导&#xff0c; dbaplus社群主办的XCOPS智能运维管理人年会在广州盛大召开&#xff0c;活动汇聚500余名金融、政府、能源、教育、电信、交通等领域的行业专家。深算院崖山数据库受邀参会&#xff0c;系统性…...

服务端安全测试:OWASP ZAP使用

ZAP下载地址:https://www.zaproxy.org/download/ ZAP有两种扫描方式: 1、使用 OpenAPI / Swagger 地址进行扫描 2、ZAP Proxy + Postman 因为业务云没有添加swagger插件所以本次介绍第2种方式。 【第一步】设置 ZAP 的代理端口(默认是 127.0.0.1:8080) 成功安装并打…...

Amazon Q 从入门到精通 – 测试与重构

Amazon Q Developer 是亚马逊推出的一个专为专业开发人员设计的人工智能助手&#xff0c;旨在提升代码开发和管理效率。其主要功能包括代码生成、调试、故障排除和安全漏洞扫描&#xff0c;提供一站式代码服务。 众所周知&#xff0c;在软件开发领域&#xff0c;测试代码是软件…...

[CSS3]属性增强2

空间转换 使用transform属性实现元素在空间内的位移、旋转、缩放等效果 空间: 是从坐标轴角度定义的。x、y 和z三条坐标轴构成了一个立体空间&#xff0c;z轴位置与视线方向相同。空间转换也叫3D转换 空间位移 使用translate实现元素空间位移效果 transform: translate3d(x…...

Go 语言 vs C+Lua(Skynet)游戏服务器方案对比分析

为啥挑这两个呢&#xff1f;因为两种技术分别对应CSP模型和Actor模型&#xff0c;都是经过时间检验的成熟且可靠的并发模型&#xff0c;问了很多地方&#xff0c;经过gpt整理得出如下报告。 从开发效率、运行性能、热更新扩展、云部署与水平扩展能力、多类型游戏支持等五个维度…...

ArcGIS Pro 3.4 二次开发 - 内容

环境&#xff1a;ArcGIS Pro SDK 3.4 .NET 8 文章目录 内容1 工程1.1 创建一个空工程1.2 使用指定名称创建新工程1.3 使用Pro的默认设置创建新工程1.4 使用自定义模板文件创建新工程1.5 使用 ArcGIS Pro 提供的模板创建工程1.6 打开现有工程1.7 获取当前工程1.8 获取当前工程的…...

java每日精进 5.19【Excel 导入导出】

基于 EasyExcel 实现 Excel 的读写操作&#xff0c;可用于实现最常见的 Excel 导入导出等功能。 Excel 导入导出功能涉及前后端协作&#xff0c;后端处理数据查询、文件生成和解析&#xff0c;前端提供用户交互和文件下载/上传界面。以下是全流程解析&#xff0c;分为导出流程…...