Android ANR 监控方法与事件分发耗时优化实战
一、ANR 监控方法
(一)系统日志分析
系统日志始终是查找 ANR 根源的重要依据。利用日志分析,不仅可以锁定 ANR 发生的精确时刻,还能追踪到主线程、关键函数调用的阻塞细节。
- 日志关键词检索:利用 ADB 命令(如 adb logcat)搜索 “am_anr”、“Input dispatching timed out” 等关键词,可以精准定位 ANR 出现的时间点与相关进程信息。
- 实战提示:在日志中过滤出 “ANR IN” 信息,结合 PID 分析,能有效缩小排查范围。
- 主线程堆栈追踪:ANR 发生时,系统会生成详细的堆栈信息文件(通常位于 /data/anr/traces.txt)。通过分析该文件,开发者可确认主线程在 ANR 前后执行的具体函数,识别出可能存在的阻塞操作。
- 案例解析:若发现堆栈信息中长时间停留在数据库查询或网络请求相关方法上,通常意味着这些耗时操作未合理转移到后台线程,从而导致了主线程阻塞。
- CPU 使用率与资源争用:借助 Systrace 或 Android Profiler 对系统整体 CPU、内存等资源进行监控,可以发现是否存在系统级资源争用问题,加剧了主线程的负担。
- 关键洞察:频繁的系统调用或高占用率往往预示着多线程同步不当或资源竞争,建议在日志中重点检查此类信息。
(二)应用内埋点监控
为了在应用运行期间实时捕捉 ANR 前兆,许多开发者选择在代码中引入内埋点机制,监控触摸事件处理时长。内埋点监控可通过自定义接口与全局监控器实现,将关键时间节点数据实时上报至日志系统或远程服务器。
- 埋点接口设计:设计一个统一的监控接口,对触摸事件的开始与结束进行标记。如下示例展示了如何定义接口及其实现:
public interface ANRMonitor {void onTouchEventStart();void onTouchEventEnd();
}
实现类中记录系统时间并计算持续时间,若超过设定阈值(如 5000 毫秒),则打印警告日志:
public class ANRGlobalMonitor implements ANRMonitor {private static final long MAX_TOUCH_DURATION = 5000;private long mStartTime;@Overridepublic void onTouchEventStart() {mStartTime = System.currentTimeMillis();}@Overridepublic void onTouchEventEnd() {long duration = System.currentTimeMillis() - mStartTime;if (duration > MAX_TOUCH_DURATION) {Log.e("ANRGlobalMonitor", "检测到潜在ANR:触摸事件耗时 " + duration + " 毫秒");}}
}
- 全局监控器注册与应用场景:通过在 Application 类中注册全局监控器,并在各个 Activity 或自定义 View 中调用监控接口,开发者可以实时捕获触摸事件的处理时长,并对异常情况做出及时响应。
- 实战建议:结合埋点数据与系统日志,构建完整的 ANR 监控链路,有助于在问题初期就采取补救措施,降低系统整体风险。
- 技术延伸:内埋点方案还可与远程统计平台(如 Firebase Performance Monitoring)结合,构建实时数据上报系统,便于在大规模设备上聚合和分析异常数据 citeciteFirebaseANR。
(三)第三方监控工具
针对 ANR 问题,业内提供了多款专业工具以便更直观地进行性能诊断和调试。以下列举几种主流工具及其核心功能:
- TraceView:用于详细统计方法调用时长,直观呈现耗时热点,帮助定位主线程内的瓶颈代码。
- 使用场景:当怀疑某段逻辑消耗大量时间时,使用 TraceView 能快速获得方法级别的调用链信息。
- Systrace:通过捕捉系统各个线程的执行状态,生成时间轴视图,帮助开发者了解整个系统在 ANR 前后的动态变化。
- 注意事项:Systrace 能捕捉到 CPU 占用、线程阻塞等信息,适用于系统级问题分析。
- Firebase Performance Monitoring:提供实时监控与数据上报,支持远程监控应用性能,并对关键性能指标进行告警。
- 优势亮点:借助 Firebase 平台,可以在大规模用户群中及时捕获性能问题,并通过仪表盘进行综合分析。
二、事件分发耗时优化策略
优化触摸事件分发过程中的耗时问题,关键在于将耗时操作合理隔离并利用多线程异步化机制,同时优化布局结构和算法复杂度,确保主线程保持高响应状态。
(一)耗时操作的异步化
在触摸事件处理中,往往存在大量的网络请求、数据库查询或复杂计算任务,这些操作应全部移至后台线程执行,避免阻塞主线程。
- 多线程实现示例:使用 AsyncTask 实现网络请求的异步处理:
private class NetworkTask extends AsyncTask<Void, Void, String> {@Overrideprotected String doInBackground(Void... params) {return performNetworkRequest();}@Overrideprotected void onPostExecute(String result) {handleNetworkResponse(result);}
}
其中,doInBackground () 方法负责在后台执行耗时任务,而 onPostExecute () 则在主线程中处理结果,确保界面更新不受阻塞。
2. 线程同步及 UI 更新:使用 Handler 或 runOnUiThread 确保后台线程执行结束后安全地更新 UI:
private Handler mHandler = new Handler(Looper.getMainLooper());private void handleNetworkResponse(final String result) {mHandler.post(() -> updateUIWithResult(result));
}
注意:异步化操作虽能大幅降低主线程压力,但同时需要注意线程同步问题,确保数据一致性与 UI 更新的原子性。
(二)布局与视图优化
视图层次结构的复杂度直接影响事件分发的效率。精简布局层级和采用合理的布局控件能显著减少触摸事件传递与渲染时间。
- 采用扁平化布局:尽量使用 ConstraintLayout 替代深层嵌套的布局结构,利用其高效的约束机制实现视图定位,降低布局渲染时间。
- 实战技巧:在设计复杂页面时,优先选择 ConstraintLayout,避免多重嵌套对性能的不利影响。
- 延迟加载与动态加载:使用 ViewStub 延迟加载不立即需要显示的子视图,减少一次性加载视图的数量。
- 案例分享:某大型列表页面通过延迟加载隐藏部分视图,将首屏加载时间缩短了 30%,显著改善了用户体验。
- 减少过度渲染:避免在 onTouchEvent 或 onDraw 方法中执行频繁的 invalidate 调用,合理规划重绘区域,确保只在必要时触发视图重绘。
- 经验总结:通过精确控制 invalidate 调用次数,开发者可以将因视图重绘带来的额外开销降至最低 citeciteLayoutOptim。
(三)避免复杂计算与同步阻塞
复杂运算和不合理的线程同步常常成为触摸事件处理中的 “隐形杀手”。在设计业务逻辑时,优化算法和数据结构、采用缓存策略可以大大降低计算复杂度。
- 缓存机制的应用:对于重复计算的逻辑,可利用内存缓存存储中间结果,避免重复运算。
代码示例:
Map<Integer, CalculationResult> cache = new HashMap<>();public CalculationResult computeResult(int key) {if (cache.containsKey(key)) {return cache.get(key);}CalculationResult result = performComplexCalculation(key);cache.put(key, result);return result;
}
- 简化判断逻辑与使用高效算法:替换冗长的 if - else 判断为 switch 语句,或利用枚举类型规范逻辑分支;对排序等操作,尽量采用快速排序等高效算法。
- 优化建议:定期进行代码审查,查找并优化存在复杂运算或低效循环的部分,确保在触摸事件频繁调用时,算法能够迅速响应 citeciteAlgorithmOptim。
- 位运算及数学运算优化:针对多点触控等场景,使用位运算替代传统逻辑判断,既简化代码又提高运行效率。同时,尽可能采用整数运算代替浮点运算以降低计算开销。
三、ANR 问题排查与性能瓶颈定位
深入排查 ANR 问题需要结合堆栈信息、日志数据和监控指标,从全局与局部两个层面寻找根源。以下提供几种常用方法和实际案例,帮助开发者快速定位瓶颈问题。
(一)堆栈信息分析
- 获取与解析堆栈信息:当系统触发 ANR 后,会在 /data/anr/traces.txt 中记录所有线程的调用堆栈。重点关注主线程的调用链,寻找长时间停留在某个方法或循环中的迹象。
- 实例解析:通过比对多个 ANR 日志,发现某应用在调用自定义 onDraw 方法时停顿明显,进而确定问题源于自定义视图中的不合理逻辑。
- 死锁与线程阻塞检查:分析堆栈信息时,注意检查是否存在多个线程互相等待锁释放的情况。死锁现象通常表现为堆栈中多个线程在同一代码位置等待同一资源,需结合代码逻辑进行调试。
(二)性能瓶颈定位方法
- Logcat 与 traces.txt 结合排查:利用 Logcat 日志中记录的 ANR 关键字及 PID 信息,与 traces.txt 文件中的详细堆栈结合,能更准确地定位问题发生的代码行。
- 使用 Android Profiler 与 Systrace:Android Profiler 能实时监控应用的 CPU、内存、网络等指标,结合 Systrace 的时间轴图,能直观展示 ANR 发生前后系统各组件的状态。
- 实战案例:在一次性能调优中,开发者通过 Profiler 发现某网络请求操作阻塞导致主线程长时间等待,经调整后问题得到根本改善。
- 集成第三方监控平台:利用 Firebase Performance Monitoring 等工具,将 ANR 数据实时上传并在平台上进行聚合分析,有助于从大数据角度识别普遍存在的性能瓶颈 citeciteThirdPartyANR。
(三)常见问题与优化案例解析
以下列举几种常见的 ANR 案例及其优化方案:
- 网络请求阻塞
- 问题描述:主线程中直接执行网络请求,导致界面长时间无响应。
- 优化措施:将网络请求转移至后台线程,利用异步任务并在完成后安全更新 UI。
- 实际效果:应用响应时间降低 70%,ANR 发生率显著下降。
- 数据库查询耗时
- 问题描述:在主线程中执行复杂 SQL 查询,导致查询过程中阻塞界面响应。
- 优化措施:使用异步数据库操作库(如 Room 的异步查询),并结合缓存机制减少重复查询。
- 实际效果:查询性能提升明显,ANR 风险降低。
- 自定义视图中复杂计算
- 问题描述:自定义 View 的 onDraw 方法中执行大量实时计算,致使绘制时长超出预期。
- 优化措施:将复杂计算提前或在后台线程中预处理,必要时引入硬件加速技术。
- 实际效果:视图渲染更加流畅,用户体验大幅改善。
- 布局嵌套过深
- 问题描述:多层嵌套布局导致事件传递过程复杂,拖慢响应速度。
- 优化措施:重构布局,采用 ConstraintLayout 等扁平化布局技术,使用 ViewStub 延迟加载。
- 实际效果:页面加载时间明显减少,触摸事件分发更加迅捷。
四、综合监控与预警系统构建
为了在生产环境中有效应对 ANR 问题,构建一套完整的综合监控与预警系统至关重要。这套系统通常包括以下模块:
- 数据采集层:利用内埋点、系统日志、第三方监控工具等手段实时采集关键指标数据,如触摸事件响应时间、主线程占用率、CPU 与内存使用情况等。
- 数据处理层:对采集到的数据进行聚合、分析和统计,通过大数据分析工具(如 Elasticsearch、Kibana 等)实时呈现各类性能指标的波动情况。
- 预警触发机制:设置多级预警规则,例如:
- 当触摸事件处理时长超过 4 秒时,自动生成预警日志;
- 当主线程阻塞次数频繁时,推送通知至监控平台;
- 当系统资源(CPU、内存)使用率超过设定阈值时,自动采集更多详细日志供后续分析。
- 自动修复与反馈:集成自动化脚本或工具,对常见的 ANR 问题进行自动诊断与修复,如自动清理缓存、重启部分子进程等措施,以确保系统长期稳定运行。
- 实践案例:某大型应用借助综合监控系统,将 ANR 预警响应时间从原先的 10 分钟缩短至 2 分钟,大幅降低了因 ANR 导致的用户投诉率 citeciteMonitorCase。
五、实战案例与经验分享
在众多项目实践中,开发者往往会遇到各式各样的 ANR 及性能瓶颈问题。以下分享若干典型案例及优化经验,供各位参考。
(一)案例一:网络请求阻塞导致 ANR
- 问题描述:某社交应用在用户连续点击 “刷新” 按钮时,主线程直接执行网络请求,导致 5 秒内无法响应用户操作,触发 ANR。
- 排查过程:
- 从 Logcat 日志中捕获 “Input dispatching timed out” 信息;
- 分析 traces.txt,发现主线程在执行网络请求相关方法时长过长;
- 利用 StrictMode 检测到网络 I/O 在主线程中被调用。
- 优化方案:
- 将网络请求代码封装为 AsyncTask 或使用 Retrofit 框架实现异步调用;
- 通过 Handler 将结果传递至主线程更新 UI;
- 在网络请求前增加连接超时和读取超时的配置,防止长时间挂起。
- 实际效果:优化后,用户操作响应时间从原先的 6 秒缩短至 500 毫秒以内,ANR 发生率降为零,用户体验大幅提升。
(二)案例二:数据库查询耗时引发界面冻结
- 问题描述:某电商应用在订单详情页中,直接在主线程执行大量 SQL 查询,导致界面卡顿甚至 ANR。
- 排查过程:
- Logcat 与 traces.txt 显示,主线程在执行 SQLiteDatabase.query 方法时长过长;
- 分析发现,多次重复查询同一数据,且未使用缓存策略;
- Android Profiler 数据显示,数据库操作期间 CPU 占用率急剧上升。
- 优化方案:
- 使用 Room 数据库框架提供的异步查询方法,将查询操作移至子线程;
- 实现内存缓存机制,避免重复查询;
- 采用分页加载技术,分批次加载数据,减少单次查询数据量。
- 实际效果:经过改造后,订单详情页的加载速度提高 80%,主线程阻塞情况得到根本改善,界面响应平滑流畅。
(三)案例三:自定义 View 绘制逻辑不当
- 问题描述:某游戏应用中自定义的 HUD(头上显示界面)View,在 onDraw 方法中执行复杂计算,导致渲染时长大幅超标,引发 ANR。
- 排查过程:
- 利用 Systrace 发现,onDraw 方法占用时间异常;
- 通过堆栈日志锁定问题代码,发现大量数学运算在主线程中实时执行;
- StrictMode 警告指出,onDraw 方法中存在耗时操作。
- 优化方案:
- 将复杂计算逻辑提前,在数据变化时计算好结果,存入缓存;
- 优化绘制算法,简化数学运算,采用硬件加速技术;
- 必要时,将部分计算任务交由 RenderScript 处理。
- 实际效果:HUD 渲染效率提升明显,绘制时间降低至原来的 20%,游戏画面稳定流畅,无 ANR 报告。
(四)案例四:布局嵌套过深引发的性能瓶颈
- 问题描述:某新闻资讯类应用中,由于布局层级过深,导致每次触摸事件传递过程中,视图渲染时间不断叠加,引起响应延迟甚至 ANR。
- 排查过程:
- 分析布局文件发现,多层嵌套存在大量冗余 View;
- 利用 Hierarchy Viewer 工具检查视图树深度,发现不合理的布局结构;
- Logcat 日志与 Systrace 图显示,事件分发时间远超正常范围。
- 优化方案:
- 重构布局文件,采用 ConstraintLayout 替换深层嵌套布局;
- 使用 ViewStub 延迟加载非必要视图,减少首屏加载压力;
- 优化自定义 View,实现扁平化设计,减少不必要的嵌套调用。
- 实际效果:布局优化后,页面响应速度显著提升,触摸事件分发时间减少 50%,整体用户体验得到极大改善。
相关文章:
Android ANR 监控方法与事件分发耗时优化实战
一、ANR 监控方法 (一)系统日志分析 系统日志始终是查找 ANR 根源的重要依据。利用日志分析,不仅可以锁定 ANR 发生的精确时刻,还能追踪到主线程、关键函数调用的阻塞细节。 日志关键词检索:利用 ADB 命令ÿ…...
【蓝桥杯单片机】第十一届省赛
一、真题 二、创建工程 1.在C盘以外的盘新建文件夹,并在文件夹里面创建两个文件夹Driver 和Project 2.打开keil软件,在新建工程并选择刚刚建好的project文件夹,以准考证号命名 3.选择对应的芯片型号 4.选择否,即不创建启动文件 …...
【ES6】模块化
概述 模块功能主要有两个命令,export和import。 一个js文件就是一个模块。 参考视频 【一小时速通JavaScript模块化,涵盖CommonJS与ES6模块化-哔哩哔哩】 https://b23.tv/gZ1uK7V 导出成员 在正常变量、函数前加export关键字。 导入模块 在另一个…...
C++学习——顺序表(六)
文章目录 前言一、找到数组的中间位置二、有序数组中的单一元素三、杨辉三角(Ⅱ)四、超过阈值的最小操作数Ⅰ五、找出峰值六、统计已测试设备七、统计和小于目标的下标对数目1.单向遍历法2.双指针法(时间复杂度小) 八、计算K置位下…...
python迭代器生成器
迭代器生成器区别 通俗版概念 迭代器(Iterator) 像“快递员送快递”: 你有一个包裹清单(比如Excel里的测试用例),快递员(迭代器)会按顺序一个一个送(遍历&#x…...
Hive SQL 精进系列:字符串拼接的三种常用方式
Hive字符串拼接:三种常用方式深度剖析 目录 Hive字符串拼接:三种常用方式深度剖析引言一、简洁直观的||操作符1. 基础语法规则2. 丰富多样的示例展示3. 优势与局限分析 二、规范通用的CONCAT函数1. 全面的语法解析2. 生动的示例说明3. 优势与局限剖析 三…...
MATLAB—从入门到精通的第二天
在第一天的学习中,我们掌握了 MATLAB 的安装配置、基础语法、变量管理和运算符的使用。本文将深入讲解 控制结构(嵌套 if、switch)、循环类型 和 向量操作,帮助读者进一步掌握 MATLAB 的核心编程技能。 1. 条件语句进阶 1.1 嵌套…...
韦伯望远镜的拉格朗日点计算推导过程,包含MATLAB和python运动轨迹仿真代码
研究过程 起源与提出:1687 年牛顿提出 “三体问题”,旨在研究三个可视为质点的天体在相互之间万有引力作用下的运动规律,但因运动方程过于复杂,难以得到完全解。欧拉的贡献1:1767 年,瑞士数学家莱昂哈德・…...
【 现代后端架构演进:微服务设计与云原生】
现代后端架构演进:微服务设计与云原生 一、架构演进历程 1. 单体架构到分布式系统 单体架构瓶颈 典型问题:代码耦合(代码行超百万级)、扩展困难(垂直扩容成本 > 1 0 5 >10^5 >105美元/节点)、技术…...
[JAVASE] 注解
一. 注解是什么? 注解是一种为程序元素提供元数据的方法.注解就是为程序做特殊标记的. 二. java内置的注解 分别是: 作用在代码的注解是: Override - 检查该方法是否是重写方法。如果发现其父类,或者是引用的接口中并没有该方法时,会报编译错误。 De…...
热成像仪真不错
我挂在外面的网路设备箱 室内的机柜 室外的猫 所用型号为优利德UTi160S,显示模式为(可见光与热成像)融合模式。...
Vue-Virtual-Scroller虚拟滚动
前端优化不可不避的一谈之虚拟滚动:众所周知,滚动是直挺挺的往dom树加东西,如果滚太多滚到万级,渲染过多就会卡顿,而vue-virtual-scroll的灵活懒渲染就能解决这个问题 1,下载与配置 npm install --save v…...
Matlab:矩阵运算篇——矩阵
目录 1.定义 实例——创建矩阵 实例——创建复数矩阵 2.矩阵的生成 实例——M文件矩阵 2.利用文本创建 实例——创建生活用品矩阵 3.创建特殊矩阵 实例——生成特殊矩阵 4.矩阵元素的运算 1.矩阵元素的修改 实例——新矩阵的生成 2.矩阵的变维 实例——矩阵维度修…...
[Java]使用java进行JDBC编程
首先要从中央仓库下载api(类似驱动程序),为了链接java和mysql 下载jar包,需要注意的是jar包的版本要和mysql保持一致 下面是新建文件夹lib,把jar包放进去,并添加为库 sql固定的情况下运行 import com.mysql.cj.jdbc.MysqlDataSo…...
HippoRAG 2 原理精读
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 整体流程离线索引阶段在线检索和问答阶段 总结 整体流程 从上图可以看出,整个流程分为两个阶段 1、离线索引阶段 2、在线检索和问答阶段 离线索引阶段…...
HTTPS协议原理:在Linux世界里的加密冒险
大家好,欢迎来到这次奇妙的HTTPS协议探险之旅!今天,我们将一起潜入Linux的深处,揭开HTTPS协议那神秘而迷人的面纱。别担心,即使你是技术小白,也能在这场冒险中找到乐趣和收获。想象一下,你是一位…...
Spring Boot启动流程及源码实现深度解析
Spring Boot启动流程及源码实现深度解析 一、启动流程概述 Spring Boot的启动流程围绕SpringApplication类展开,核心流程可分为以下几个阶段: 初始化阶段:推断应用类型,加载ApplicationContextInitializer和ApplicationListene…...
使用pip在Windows机器上安装Open Webui,配合Ollama调用本地大模型
之前的文章分享过在 linux 服务器上安装,并使用Open-webui 来实现从页面上访问本地大模型的访问。也写了文章分享了我在家里 Windows Server 台式机上安装 Ollama 部署本地大模型,并分别使用 Chatbox 和 CherryStudio 来访问本地的大模型。今天我来分享一…...
go map的声明和使用
1.简介 map是key-value数据结构,又称为字段或者关联数据。类似其他语言的集合,map在go中是引用类型,必须初始化才能使用。 2.语法 map[keytype]valuetype keytype:表示间的类型。可以是基本数据类型,还可以是指针、channl等。…...
word毕业论文“et al.”替换为“等”——宏
Sub 中文参考文献改等()中文参考文献改等 宏Selection.Find.ClearFormattingSelection.Find.Replacement.ClearFormattingWith Selection.Find.Text "([一-龥], )et al.".Replacement.Text "\1等.".Forward True.Wrap wdFindContinue.Format False.Ma…...
23. 观察者模式
原文地址: 观察者模式 更多内容请关注:智想天开 1. 观察者模式简介 观察者模式(Observer Pattern)是一种行为型设计模式,用于建立对象之间的一种一对多的依赖关系。当一个对象的状态发生变化时,所有依赖于它的对象都…...
go的”ambiguous import in multiple modules”
执行“go mod tidy”报如下错误: go mod tidy -compat1.17 go: finding module for package github.com/gomooon/goredis go: found github.com/gomooon/goredis in github.com/gomooon/goredis v0.3.5 go: github.com/gomooon/core importsgithub.com/gomooon/gor…...
【鸿蒙开发】MongoDB入门
https://www.mongodb.com/try/download/community 下载MongoDB: var mongoose require("mongoose");// localhost 域名,代表本机 // 127.0.0.1 ip , 代码本机 mongoose.connect("mongodb://localhost:27017/jiaju").then(() > {console.l…...
【应用篇】MLU上deepseek/QwQ-32B+dify实现workflow应用
文章目录 前言一、平台环境选择二、创建容器应用三、启动服务1.下载deepseekR1-14B模型2.VLLM启动服务3.postman测试服务 四、workflow搭建1.搭建第一个工作流2.详细配置 五、效果演示 前言 本章主要讲解如何用paas平台,实现智能体应用 本章中大模型我们使用deeps…...
vue组件库el-menu导航菜单设置index,地址不会变更的问题
请先确认 1.路由已配置好 route-index.js如下, 2.view-ProHome.vue中已预留路由展示位 3.导航菜单复制组件库,并做修改 其中index与路由配置的地址一致 运行后发现点击菜单,url地址还是不变,查看组件库 Element - The worlds …...
防抖和节流
防抖(Debounce)和节流(Throttle)是前端开发中常用的两种性能优化技术,主要用于控制高频事件的触发频率,避免不必要的性能消耗。 1. 防抖(Debounce) 防抖的核心思想:在事…...
Deepseek可以通过多种方式帮助CAD加速工作
自动化操作:通过Deepseek的AI能力,可以编写脚本来自动化重复性任务。例如,使用Python脚本调用Deepseek API,在CAD中实现自动化操作。 插件开发:结合Deepseek进行二次开发,可以创建自定义的CAD插件。例如&a…...
基于Spring Boot的宠物猫认养系统的设计与实现(LW+源码+讲解)
专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌。 技术范围:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:…...
开源!速度100Kb/s的有线和无线双模ESP32S3芯片的DAP-Link调试器
开源!速度100Kb/s的有线和无线双模ESP32S3芯片的DAP-Link调试器 目录 开源!速度100Kb/s的有线和无线双模ESP32S3芯片的DAP-Link调试器本项目未经授权,禁止商用!本项目未经授权,禁止商用!本项目未经授权&…...
Vue3 模板引用:打破数据驱动的次元壁(附高阶玩法)
在数据驱动的Vue世界中,模板引用(Template Refs)是我们与真实DOM对话的秘密通道。本文将带你深入理解这个"逃生舱"的正确打开方式,并分享实战中的高阶技巧。 一、基础入门:建立DOM连接 1. 创建模板引用 &…...
第五天 Labview数据记录(5.5 SQL数据库读写)
5.5 SQL数据库读写 SQL 数据库读写操作是现代软件开发、数据分析和企业信息系统的核心功能。其意义不仅体现在技术层面,还涉及到业务流程优化、数据管理、决策支持等多个方面。以下是 SQL 数据库读写操作的重要意义:1. 数据存储与管理;2. 支…...

微信小程序项目引入图片问题:Error: module ‘assets/img/topImg.jpg.js‘ is not defined
问题与处理策略 问题描述 在微信小程序项目中,通过 require 引入图片文件,报如下错误 Error: module assets/img/topImg.jpg.js is not defined, require args is ../../assets/img/topImg.jpg# 翻译错误:未定义模块“assets/img/topImg.…...
02C#基本结构篇(D4_注释-访问修饰符-标识符-关键字-运算符-流程控制语句)
目录 一、注释 1. 单行注释 2. 多行注释 3. XML文档注释 4. 使用建议和最佳实践: 二、访问修饰符 1. public 2. private 3. protected 4. internal 5. protected internal 或 protected and internal 6. private protected 或 private and protected 7.…...
Python:正则表达式
正则表达式的基础和应用 一、正则表达式核心语法(四大基石) 1. 元字符(特殊符号) 定位符 ^:匹配字符串开始位置 $:匹配字符串结束位置 \b:匹配单词边界(如 \bword\b 匹配…...
ChatGPT4.5详细介绍和API调用详细教程
OpenAI在2月27日发布GPT-4.5的研究预览版——这是迄今为止OpenAI最强大、最出色的聊天模型。GPT-4.5在扩大预训练和微调规模方面迈出了重要的一步。通过扩大无监督学习的规模,GPT-4.5提升了识别内容中的模式、建立内容关联和生成对于内容的见解的能力,但…...
linux makefile tutorial
一个makefile的教程,几个小时就能看完,对makefile有个总体加细节的系统了解,非常不错: Learn Makefiles With the tastiest examples 中文翻译版: 起步 - Makefile 教程 (gavinliu6.github.io) gcc官网手册&#x…...
学习C2CRS Ⅲ (Response Generation Module)
代码地址:https://github.com/RUCAIBox/WSDM2022-C2CRS 论文地址:https://arxiv.org/abs/2201.02732 CFSelectionConvModel模型结构与功能 CFSelectionConvModel 是一个用于对话推荐系统的端到端模型,结合了知识图谱(KG)、评论信息和对话上下文来生成对话响应。它通过以…...
SpringBoot全栈开发:从数据库到Markdown文件导出的终极实践指南
一、SpringBoot后端核心实现 1.1 数据库数据转MD文件 通过SpringBoot实现数据库内容导出为Markdown文件,是文档自动化生成的关键技术: GetMapping("/download") public void exportMd(HttpServletResponse response, Integer id) {Content …...
go函数详解
1.简介 函数是组织好的、可重复使用的,用于执行指定任务的代码块,为了完成某一个功能的程序指令的集合,称为函数。go语言中支持:函数、匿名函数和闭包。 2.函数的定义 func 函数名 (形参列表) (返回值列表){ 函数体 return …...
MVCC实现原理
一、引言 在现代数据库管理系统中,数据的一致性和并发性是两个至关重要的特性。传统的锁机制虽然有效,但也存在着性能瓶颈,特别是在高并发环境下,锁的争用会导致系统响应时间变慢,甚至引发死锁等问题。为了克服这些挑…...
通过Golang的container/list实现LRU缓存算法
文章目录 力扣:146. LRU 缓存主要结构 List 和 Element常用方法1. 初始化链表2. 插入元素3. 删除元素4. 遍历链表5. 获取链表长度使用场景注意事项 源代码阅读 在 Go 语言中,container/list 包提供了一个双向链表的实现。链表是一种常见的数据结构&#…...
网络编程7天学java
* 网络编程:两台或两台以上的主机构成一个网络 * IP地址:标志网络中的一个通信实体的地址 * 端口号:区分不同应用程序 * 网络通信协议:ISO参考模型(7层),TCP/IP协议(4层)…...
在 IntelliJ IDEA 中配置 Git
1. 确保已安装 Git 在配置之前,确保你的系统已经安装了 Git。 检查是否已安装 Git: bash 复制 git --version 如果未安装,请前往 Git 官网 下载并安装。 2. 在 IntelliJ IDEA 中配置 Git 打开 IntelliJ IDEA。 进入设置: Windo…...
【Godot4.4】Rect2总结
概述 Rect2是2D场景中比较重要的一种数据类型。 Rect2的本质含义是2D场景的轴对齐包围盒,而不是可以自由变换的矩形。 Rect2提供了一些方法,可以方便的判断Rect2之间是否重叠、包含等,并可以获得重叠的区域。也可以获得两个Rect2的包围盒。…...
git使用命令总结
文章目录 Git 复制创建提交步骤Git 全局设置:创建 git 仓库:已有仓库? 遇到问题解决办法:问题一先git pull一下,具体流程为以下几步: 详细步骤 Git 复制 git clone -b RobotModelSetting/develop https://gitlab.123/PROJECT/123.git创建提…...
Unity DOTS从入门到精通之 C# Job System
文章目录 前言安装 DOTS 包C# 任务系统Mono 环境DOTS 环境运行作业NativeContainer 前言 作为 DOTS 教程,我们将创建一个旋转立方体的简单程序,并将传统的 Unity 设计转换为 DOTS 设计。 Unity 2022.3.52f1Entities 1.3.10 安装 DOTS 包 要安装 DOTS…...
linux下的网络抓包(tcpdump)介绍
linux下的网络抓包[tcpdump]介绍 前言tcpdump1. 安装 tcpdump2. 基本抓包命令3. 过滤器使用4. 保存捕获的数据包 异常指标1. 连接建立与断开相关指标异常 SYN 包异常 FIN 或 RST 包 2. 流量相关指标异常流量峰值异常源或目的 IP 流量 3. 端口相关指标异常端口使用端口扫描 4. 数…...
深入理解 Linux 中的 -h 选项:让命令输出更“人性化”
在 Linux 系统中,命令行工具是系统管理员和普通用户最常用的交互方式之一。然而,命令行输出往往充满了技术性术语和数字,对于初学者或非技术用户来说可能显得晦涩难懂。幸运的是,许多 Linux 命令都提供了一个非常实用的选项&#…...
selenium的鼠标操作
1、鼠标操作 鼠标时间对应的方法在那个类中? ActionChains类,实例化 鼠标对象 1、context_click(element) # 右击 2、double_click(element) #双击 3、double_and_drop(source, target) # 拖拽 4、move_to_element(element) # 悬停 【重点】 5、perform() …...
STM32——GPIO介绍
GPIO(General-Purpose IO ports,通用输入/输出接口)模块是STM32的外设接口的核心部分,用于感知外界信号(输入模式)和控制外部设备(输出模式),支持多种工作模式和配置选项。 1、GPIO 基本结构 STM32F407 的每个 GPIO 引脚均可独立配置,主要特性包括: 9 组 GPIO 端口…...