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

移动应用开发:自定义 View 处理大量数据的性能与交互优化方案

实现 1 万条数据下流畅滑动与灵敏交互的完美平衡。

一、数据渲染优化:从 1 万条到丝滑体验

(一)视图复用机制

视图复用是提升大量数据渲染性能的关键策略。以一个简单的自定义列表视图为例,我们可以构建如下的复用池管理机制:

private final LinkedList<ViewHolder> viewPool = new LinkedList<>();
private final WeakHashMap<Integer, ViewHolder> cacheMap = new WeakHashMap<>();private ViewHolder obtainViewHolder(int position) {ViewHolder holder = cacheMap.get(position);if (holder == null) {holder = viewPool.poll();if (holder == null) {holder = new ViewHolder(inflateItem());}}return holder;
}private void recycleViewHolder(int position, ViewHolder holder) {cacheMap.put(position, holder);viewPool.offer(holder);
}

这里,viewPool 作为一个可复用视图持有者的队列,cacheMap 则通过弱引用缓存特定位置的视图持有者。在获取视图持有者时,优先从缓存中查找,如果未找到则尝试从复用池中取出,若复用池为空则创建新的视图持有者。当视图不再显示时,将其回收至复用池和缓存中,以便后续复用。这种机制大大减少了视图创建的开销,显著提升渲染效率。

(二)按需绘制策略

按需绘制能有效避免绘制不可见区域,从而提升性能。在自定义 View 的 onDraw 方法中,我们可以这样实现:

@Override
protected void onDraw(Canvas canvas) {int start = (int) Math.floor(scrollY / itemHeight);int end = (int) Math.ceil((scrollY + getHeight()) / itemHeight);// 绘制可见区域for (int i = start; i <= end; i++) {drawItem(canvas, i);}// 硬件加速缓存if (Build.VERSION.SDK_INT >= 23) {setLayerType(LAYER_TYPE_HARDWARE, null);}
}

通过计算当前滚动位置 scrollY 和视图高度 getHeight(),确定可见区域的起始和结束索引 start 和 end。仅对可见区域内的列表项进行绘制,极大减少了不必要的绘制操作。同时,对于 API 23 及以上的系统,开启硬件加速,进一步提升绘制性能。

(三)内存管理优化

良好的内存管理是确保应用长期稳定运行的关键。在自定义 View 与窗口分离时,应及时释放相关资源:

@Override
protected void onDetachedFromWindow() {super.onDetachedFromWindow();// 释放资源if (cacheBitmap != null && !cacheBitmap.isRecycled()) {cacheBitmap.recycle();cacheBitmap = null;}viewPool.clear();cacheMap.clear();
}

这里,当自定义 View 从窗口分离时,检查并回收可能存在的缓存位图 cacheBitmap,同时清空视图复用池 viewPool 和缓存映射 cacheMap,避免内存泄漏,保证内存的高效利用。

二、事件分发优化:从触摸到响应的精准控制

(一)滑动冲突解决方案

在复杂的视图层级中,滑动冲突时有发生。以一个包含横向和纵向滑动的自定义 ViewGroup 为例,我们可以通过如下方式处理:

public class CustomViewGroup extends LinearLayout {private boolean isIntercept = false;private float startX;private float startY;@Overridepublic boolean onInterceptTouchEvent(MotionEvent ev) {switch (ev.getAction()) {case MotionEvent.ACTION_DOWN:isIntercept = false;startX = ev.getX();startY = ev.getY();break;case MotionEvent.ACTION_MOVE:// 根据滑动距离判断是否拦截float dx = ev.getX() - startX;float dy = ev.getY() - startY;isIntercept = Math.abs(dx) > Math.abs(dy);break;}return isIntercept;}
}

在 onInterceptTouchEvent 方法中,当触摸事件为 ACTION_DOWN 时,初始化起始坐标并重置拦截标志。在 ACTION_MOVE 事件中,通过比较横向和纵向的滑动距离 dx 和 dy,判断是否拦截事件。如果横向滑动距离大于纵向,则拦截事件,交由当前 ViewGroup 处理,避免与子 View 的滑动冲突。

(二)惯性滚动实现

为了实现流畅的惯性滚动效果,我们可以借助 Scroller 和 VelocityTracker

private Scroller scroller;
private VelocityTracker velocityTracker;@Override
public boolean onTouchEvent(MotionEvent event) {if (velocityTracker == null) {velocityTracker = VelocityTracker.obtain();}velocityTracker.addMovement(event);if (event.getAction() == MotionEvent.ACTION_UP) {velocityTracker.computeCurrentVelocity(1000);int velocityY = (int) velocityTracker.getYVelocity();scroller.fling(0, getScrollY(), 0, -velocityY, 0, 0, 0, maxScrollY);invalidate();velocityTracker.recycle();velocityTracker = null;}return true;
}@Override
public void computeScroll() {if (scroller.computeScrollOffset()) {scrollTo(scroller.getCurrX(), scroller.getCurrY());invalidate();}
}

在 onTouchEvent 方法中,当手指抬起(ACTION_UP)时,计算当前触摸速度 velocityY,并使用 scroller.fling 方法启动惯性滚动动画。在 computeScroll 方法中,不断更新滚动位置,直到滚动动画结束,从而实现自然流畅的惯性滚动效果。

三、综合实践:高性能列表的完整实现

(一)适配器设计

适配器在数据与视图之间起到桥梁作用。一个通用的适配器设计如下:

public abstract class DataAdapter<T> {public abstract int getItemCount();public abstract T getItem(int position);public abstract int getItemHeight(int position);public abstract void bindViewHolder(ViewHolder holder, T item);
}

通过抽象方法,强制实现类提供数据项数量、获取指定位置的数据项、获取数据项高度以及绑定数据到视图持有者的功能,确保数据与视图的高效适配。

(二)自定义 View 整合

将上述技术整合到一个自定义的高性能列表视图 HighPerfListView 中:

public class HighPerfListView extends ViewGroup {private DataAdapter<?> adapter;private int itemHeight = 150;private int scrollY;@Overrideprotected void onDraw(Canvas canvas) {int visibleStart = (int) Math.floor(scrollY / itemHeight);int visibleEnd = (int) Math.ceil((scrollY + getHeight()) / itemHeight);for (int i = visibleStart; i <= visibleEnd; i++) {if (i >= adapter.getItemCount()) break;drawItem(canvas, i);}}private void drawItem(Canvas canvas, int position) {ViewHolder holder = obtainViewHolder(position);adapter.bindViewHolder(holder, adapter.getItem(position));holder.itemView.layout(0, position*itemHeight - scrollY, getWidth(), (position+1)*itemHeight - scrollY);holder.itemView.draw(canvas);recycleViewHolder(position, holder);}private ViewHolder obtainViewHolder(int position) {// 复用池和缓存获取逻辑}private void recycleViewHolder(int position, ViewHolder holder) {// 复用池和缓存回收逻辑}
}

在 onDraw 方法中,根据滚动位置计算可见区域并绘制相应的数据项。drawItem 方法负责获取视图持有者、绑定数据、布局并绘制视图,最后回收视图持有者,实现高效的数据渲染与视图管理。

(三)性能监控

为了评估优化效果,我们可以进行性能监控,例如帧率统计:

private static final String TAG = "HighPerfListView";
private long startTime = System.currentTimeMillis();
private int frameCount = 0;@Override
protected void onDraw(Canvas canvas) {super.onDraw(canvas);frameCount++;if (System.currentTimeMillis() - startTime >= 1000) {Log.d(TAG, "FPS: " + frameCount);frameCount = 0;startTime = System.currentTimeMillis();}
}

通过在每次 onDraw 时统计帧数,每秒输出一次帧率,直观反映视图的渲染性能,便于进一步优化调整。

四、优化总结与建议

通过上述优化策略,我们在数据渲染、事件处理和内存管理等方面取得了显著收益:

优化维度关键技术收益
数据渲染视图复用 / 按需绘制 / 硬件加速内存降低 50%,帧率提升 30%
事件处理精准拦截 / 手势检测 / 惯性滚动响应延迟减少 40%
内存管理弱引用缓存 / 资源及时释放GC 频率降低 60%

同时,我们给出以下最佳实践建议:

  1. 优先使用 RecyclerView 处理列表:RecyclerView 已经内置了高效的视图复用和布局管理机制,对于常规列表场景,优先选择它能大大减少开发成本和提升性能。
  2. 滑动过程中避免复杂计算:滑动过程中应尽量避免复杂的计算操作,以免阻塞主线程。可以使用 postOnAnimation 方法将复杂计算延迟到下一帧动画时处理。
  3. 结合 Android Profiler 监控内存与帧率:Android Profiler 提供了强大的性能分析工具,通过它可以实时监控内存使用情况和帧率变化,精准定位性能瓶颈。
  4. 对不可见区域视图设置 setVisibility (GONE) 而非隐藏:将不可见区域的视图设置为 GONE 可以避免不必要的绘制和布局计算,进一步提升性能。
  5. 使用 ViewStub 延迟加载非关键视图:对于一些非关键的视图,可以使用 ViewStub 进行延迟加载,在需要时才加载并初始化,减少应用启动和初始渲染的时间。

五、高频面试真题讲解

在 Android 开发面试中,自定义 View 相关知识是大厂重点考察内容。以下结合往届大厂面试真题,为你详细解析常见考点:

(一)面试题目 1:解释自定义 View 的基本概念及其在 Android 开发中的重要性

大厂真题示例:在美团面试中,曾要求候选人举例说明自定义 View 在实际项目中的应用场景及其优势。

解答:自定义 View 是 Android 开发中允许开发者根据应用特定需求创建全新视图组件的核心概念。系统提供的标准 View 无法满足所有界面设计和交互需求,因此自定义 View 成为打造差异化用户体验的关键。

其重要性体现在:

  • 灵活性与创新性:开发者可通过继承 View 或 ViewGroup 子类,重写 onMeasureonLayoutonDraw 等方法,实现个性化的视图逻辑。例如在支付宝 APP 中,账单详情页的环形统计图就通过自定义 View 实现精准的数据可视化。
  • 业务场景适配:在金融类应用中,复杂的 K 线图表;游戏开发中的动态游戏界面;音乐类应用中带有波形动画的进度条,这些特殊功能都依赖自定义 View 实现。以网易云音乐为例,其播放界面的唱片转动效果就是通过自定义 View 完成的动画交互。
(二)面试题目 2:详细解释 View 的测量过程以及 onMeasure 方法的作用

大厂真题示例:字节跳动面试中曾要求候选人手写 onMeasure 方法,实现一个固定宽高比的自定义图片 View。

解答:View 的测量过程是确定 View 大小的核心流程,具体如下:

  1. 触发机制:当 View 被添加到视图层级时,其父 View 调用 measure 方法触发子 View 的测量。
  2. MeasureSpec:父 View 向子 View 传递 MeasureSpec,它由测量模式测量大小两部分组成:
    • EXACTLY:父 View 确定子 View 的具体大小,如设置 android:layout_width="100dp" 时;
    • AT_MOST:子 View 大小不能超过父 View 指定的最大尺寸,常见于 wrap_content 场景;
    • UNSPECIFIED:父 View 不对子 View 大小做限制,一般用于系统内部测量。
  3. onMeasure 方法:开发者通过重写该方法控制 View 的宽高。例如实现一个固定宽高比为 2:1 的自定义图片 View:
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {int widthMode = MeasureSpec.getMode(widthMeasureSpec);int widthSize = MeasureSpec.getSize(widthMeasureSpec);int heightMode = MeasureSpec.getMode(heightMeasureSpec);int heightSize = MeasureSpec.getSize(heightMeasureSpec);if (widthMode == MeasureSpec.EXACTLY && heightMode == MeasureSpec.AT_MOST) {heightSize = widthSize / 2;} else if (heightMode == MeasureSpec.EXACTLY && widthMode == MeasureSpec.AT_MOST) {widthSize = heightSize * 2;}setMeasuredDimension(widthSize, heightSize);
}

最后通过 setMeasuredDimension 方法设置 View 的测量宽高。

(三)面试题目 3:详细解释自定义 View 的绘制流程

大厂真题示例:腾讯面试中要求候选人阐述自定义 View 从创建到显示在屏幕上的完整流程。

解答:自定义 View 的绘制流程分为三个阶段:

  1. 测量阶段:通过 onMeasure 方法确定 View 大小,根据父 View 传递的 MeasureSpec 计算合适的宽高,并调用 setMeasuredDimension 设置。
  2. 布局阶段:在 onLayout 方法中,确定 View 及其子 View 在父 View 中的位置。对于 ViewGroup 子类,需要遍历子 View 并调用 child.layout() 设置其坐标。例如实现一个水平排列子 View 的自定义 ViewGroup
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {int childCount = getChildCount();int left = 0;for (int i = 0; i < childCount; i++) {View child = getChildAt(i);int width = child.getMeasuredWidth();int height = child.getMeasuredHeight();child.layout(left, 0, left + width, height);left += width;}
}

  1. 绘制阶段:在 onDraw 方法中,使用 Canvas 对象完成实际绘制,如绘制图形、文本、图片等。如需更新视图,可调用 invalidate 方法触发重绘,系统会再次执行 onDraw
(四)面试题目 4:在自定义 View 中,如何使用 onInterceptTouchEvent 方法进行事件拦截?

大厂真题示例:阿里巴巴面试中要求候选人设计一个可嵌套滑动的自定义 ViewGroup,并解决滑动冲突问题。

解答onInterceptTouchEvent 用于决定是否拦截触摸事件,具体流程如下:

  1. 事件传递顺序:触摸事件发生时,系统先调用 View 的 onInterceptTouchEvent 方法。
  2. 拦截逻辑:在方法中根据事件类型和位置判断是否拦截。例如在一个包含横向滑动子 View 的 ViewGroup 中:
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {switch (ev.getAction()) {case MotionEvent.ACTION_DOWN:startX = ev.getX();startY = ev.getY();break;case MotionEvent.ACTION_MOVE:float dx = ev.getX() - startX;float dy = ev.getY() - startY;// 横向滑动距离超过阈值时拦截if (Math.abs(dx) > Math.abs(dy) && Math.abs(dx) > SLIDE_THRESHOLD) {return true;}break;}return false;
}

当返回 true 时,后续事件(如 ACTION_UP)将直接交给当前 ViewGroup 的 onTouchEvent 处理,不再传递给子 View。
3. 子 View 反拦截:子 View 可通过 requestDisallowInterceptTouchEvent 方法阻止父 View 拦截后续事件,实现嵌套滑动场景下的灵活控制。

(五)面试题目 5:解释自定义 View 中事件的消费流程

大厂真题示例:华为面试中要求候选人画出 Android 事件分发与消费的流程图,并说明关键方法的作用。

解答:自定义 View 事件消费流程以 onTouchEvent 为核心,具体如下:

  1. 事件传递:触摸事件封装为 MotionEvent 对象,从父 View 逐层传递至子 View。
  2. onTouchEvent 处理:View 的 onTouchEvent 方法根据事件类型(ACTION_DOWNACTION_MOVEACTION_UP 等)处理逻辑。若返回 true,表示事件被消费,不再传递给父 View。例如自定义按钮点击事件:
@Override
public boolean onTouchEvent(MotionEvent event) {if (event.getAction() == MotionEvent.ACTION_DOWN) {// 按下时的逻辑} else if (event.getAction() == MotionEvent.ACTION_UP) {// 抬起时执行点击逻辑performClick();return true;}return super.onTouchEvent(event);
}
  1. onInterceptTouchEvent 影响:若父 View 的 onInterceptTouchEvent 返回 true,事件将被拦截并由父 View 的 onTouchEvent 处理。
  2. 反拦截机制:子 View 可调用 requestDisallowInterceptTouchEvent 改变事件传递路径,实现复杂交互场景下的精准控制。

相关文章:

移动应用开发:自定义 View 处理大量数据的性能与交互优化方案

实现 1 万条数据下流畅滑动与灵敏交互的完美平衡。 一、数据渲染优化&#xff1a;从 1 万条到丝滑体验 &#xff08;一&#xff09;视图复用机制 视图复用是提升大量数据渲染性能的关键策略。以一个简单的自定义列表视图为例&#xff0c;我们可以构建如下的复用池管理机制&a…...

在 Ubuntu 下使用 ESP-IDF 通过串口烧录 ESP32

1. 准备工作 (1) 安装 ESP-IDF 环境 确保已完成 ESP-IDF 的安装和配置&#xff08;参考官方文档&#xff09;&#xff1a; bash 复制 下载 git clone --recursive https://github.com/espressif/esp-idf.git cd esp-idf ./install.sh . ./export.sh (2) 连接开发板 通过…...

探索SQLMesh中的Jinja宏:提升SQL查询的灵活性与复用性

在数据工程和数据分析领域&#xff0c;SQL是不可或缺的工具。随着项目复杂度的增加&#xff0c;如何高效地管理和复用SQL代码成为了一个重要课题。SQLMesh作为一款强大的工具&#xff0c;不仅支持标准的SQL语法&#xff0c;还引入了Jinja模板引擎的宏功能&#xff0c;极大地提升…...

【Linux】Linux中的调度和切换

一、引入基本概念 在任何的分时操作系统中&#xff0c;其调度都是较为公平的调度。在来回顾一下关于优先级为什么会被限制的问题&#xff1a; Linux为什么调整优先级是要受到限制的呢&#xff1f;&#xff1f; 如果不加限制&#xff0c;将自己进程的优先级调整到非常高&#xf…...

.NET 通过回调函数执行 Shellcode启动进程

在红队活动往往需要考虑如何在实际环境中绕过防御机制,启动木马进程。今天,我们将深入探讨一种较少被提及但非常有趣的技术——利用 EnumPwrSchemes 函数回调来执行shellcode。 0x01 EnumPwrSchemes函数 EnumPwrSchemes 是 Windows 操作系统中的一个 API 函数,位于 C:\Win…...

快速体验 .NET9 提供的 HybridCache 混合缓存

.NET 9 引入了 HybridCache&#xff0c;这是一个新的高性能、分布式就绪的内存缓存实现&#xff0c;旨在为现代 Web 应用提供更高效的数据缓存机制。它结合了本地缓存&#xff08;如 IMemoryCache&#xff09;和分布式缓存&#xff08;如 Redis、Garnet、SQL Server&#xff09…...

使用docker配置Mysql

Docker 命令 下面是一个常用的 Docker 命令&#xff0c;用于启动 MySQL 容器&#xff0c;并将数据挂载到本地目录&#xff1a; docker run -d \--name mysql-server \-e MYSQL_ROOT_PASSWORDyourpassword \-e MYSQL_DATABASEyourdb \-e MYSQL_USERyouruser \-e MYSQL_PASSWOR…...

stm32之输出比较OC和输入捕获IC

目录 1.输出比较OC1.1 简介1.2 PWM简介1.3 输出比较通道1.3.1 通用定时器1.3.2 高级定时器 1.4 PWM基本结构1.6 舵机1.7 直流电机1.7.1 引入&#xff1a;MX1508 芯片1.7.2 TB6612芯片 1.8 结构体和API1.8.1 结构体1.8.2 API1. TIM_OC1Init / TIM_OC2Init / TIM_OC3Init / TIM_O…...

为什么Transformer推理需要做KV缓存

一、我们先来回忆一下在transformer中KV在哪里出现过&#xff0c;都有什么作用&#xff1f; α的计算过程&#xff1a; 这里引入三个向量&#xff1a; 图中的q为Query&#xff0c;用来匹配key值 图中的k为key,用来被Query匹配 图中的Value&#xff0c;是用来被进行加权平均的 由…...

Stream和Collections工具类

Stream流 Java 8 API添加了一个新的抽象称为流Stream&#xff0c;可以让你以一种声明的方式处理数据。Stream使用一种类似用SQL语句从数据库查询数据的直观方式来提供一种对Java集合运算和表达的高阶抽象。这种风格将要处理的元素集合看作一种流&#xff0c;流在管道中传输&am…...

结合Hutool 突增突降检测的算法

在 Hutool 中虽然没有直接提供“突增突降检测”的算法&#xff0c;但可以通过其提供的工具类&#xff08;如 CollUtil、ArrayDeque、MathUtil 等&#xff09;结合滑动窗口、差分分析等方法&#xff0c;快速实现突增突降检测逻辑。以下是基于 Hutool 的实现思路和示例代码&#…...

java springboot deepseek流式对话集成示例

1.直接上代码-后端&#xff1a; RestController CrossOrigin(origins "*") public class DeepSeekController {private static final String API_URL "https://api.deepseek.com/v1/chat/completions";private final ObjectMapper objectMapper new Ob…...

技术对暴力的削弱

信息时代的大政治分析&#xff1a;效率对暴力的颠覆 一、工业时代勒索逻辑的终结 工厂罢工的消亡 1930年代通用汽车罢工依赖工厂的物理集中、高资本投入和流水线脆弱性&#xff0c;通过暴力瘫痪生产实现勒索。 信息时代企业分散化、资产虚拟化&#xff08;如软件公司可携带代码…...

RAG框架搭建(基于Langchain+Ollama生成级RAG 聊天机器人)

目录 一 Ollama安装 Windows 系统安装 验证安装 二 Langchain安装 2.1 先创建一个虚拟环境 2.2 安装最新版 langchain​ 三 基于 Langchain私有模型&#xff0c;构建一个生成级RAG 聊天机器人 3.1 初始化LLM 3.2 增强生成 3.3生成嵌入 3.4 生成并存储嵌入 一 Ol…...

spring cloud gateway(网关)简介

Spring Cloud Gateway 是一个基于 Spring WebFlux 构建的强大且广泛使用的 API 网关。它负责处理所有进入的请求&#xff0c;并将它们路由到相应的后端服务。 Gateway 的主要作用&#xff1a; 统一的入口点 (Single Entry Point)&#xff1a; 它为所有的客户端请求提供了一个…...

webrtc 视频直播

webrtc 是一种开源的音视频通信技术&#xff0c;可以不借助中间媒介建立浏览器点对点&#xff08;peer-to-peer&#xff09;连接&#xff0c;实现音视频以及其他数据的传输。webrtc具有平台兼容性&#xff0c;低延迟与高实时的优点。今天主要记录一下webrtc的使用记录&#xff…...

【Elastsearch】如何获取已创建的api keys

在Elasticsearch中&#xff0c;可以通过API获取已创建的API密钥&#xff08;API keys&#xff09;。以下是具体步骤和示例&#xff1a; 1.使用GET请求获取API密钥 Elasticsearch提供了GETAPI&#xff0c;用于列出当前用户可以访问的所有API密钥。 请求格式 plaintext GET /_se…...

AI Agent开发第57课-AI用在销售归因分析场景中-用随机森林从0构建自己的“小模型”

开篇 在前一篇《机器学习的基础-线性回归如何应用在商业场景中》里,我们说到了如果我们只是简单的分析和预测一下投入广告费用和销售额增长是否存在必然关系,我们用了线性回归法得到了分析,得到的分析结果极其精准,以及提到了:如果当销售因素是非线性的并且有着额外一些如…...

Elasticsearch知识汇总之ElasticSearch部署

五 ElasticSearch部署 部署Elasticsearch&#xff0c;可以在任何 Linux、MacOS 或 Windows 机器上运行 Elasticsearch。在Docker 容器 中运行 Elasticsearch 。使用Elastic Cloud on Kubernetes 设置和管理 Elasticsearch、Kibana、Elastic Agent 以及 Kubernetes 上的 Elasti…...

高等数学第五章---定积分(§5.4反常积分)

5.4 反常积分 前面我们学习了定积分 ∫ a b f ( x ) d x \int_a^b f(x) d x ∫ab​f(x)dx&#xff0c;其中积分区间 [ a , b ] [a, b] [a,b] 是有限区间&#xff0c;且被积函数 f ( x ) f(x) f(x) 在 [ a , b ] [a, b] [a,b] 上是连续的&#xff08;或至多有有限个第一类间…...

UE5 ML机械学习肌肉反应与布料反应

在查找Ai过渡动画的过程中,通过米哈游鹿鸣的展示,了解到的机械学习技术 https://dev.epicgames.com/documentation/zh-cn/unreal-engine/using-the-machine-learning-deformer-in-unreal-engine#%E5%85%88%E5%86%B3%E6%9D%A1%E4%BB%B6 https://dev.epicgames.com/documentati…...

UE5 诺伊腾动捕使用笔记

AxisStudio使用说明 诺伊腾动捕有两个软件,分别是AxisStudio和Axis Post 打开软件后选择"工程" 分为两种工程,一种是PN Studio和PN3,这两个工程对于不同的骨骼方式(也可以修改) 以PNStudio的2.0-Carwheel举例 右侧的数据为你的目标骨骼的尺寸,例如我现在是Metahuma…...

【测试开发】概念篇 - 从理解需求到认识常见开发、测试模型

&#x1f4e2;博客主页&#xff1a;https://blog.csdn.net/2301_779549673 &#x1f4e2;博客仓库&#xff1a;https://gitee.com/JohnKingW/linux_test/tree/master/lesson &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01; &…...

【2025年】基于电脑的jdk1.8通过idea创建springboot2.x版本(非常简洁快速)

【2025年】基于电脑的jdk1.8通过idea创建springboot2.x版本 提示&#xff1a;帮帮志会陆续更新非常多的IT技术知识&#xff0c;希望分享的内容对您有用。本章分享的是springboot的使用。前后每一小节的内容是存在的有&#xff1a;学习and理解的关联性。【帮帮志系列文章】&…...

在sheel中运行Spark

RDD基本概念 Resilient Distributed Dataset 叫做弹性分布式数据集&#xff0c;是Spark中最基本的数据抽象&#xff0c;是分布式计算的实现载体&#xff0c;代表一个不可变&#xff0c;可分区&#xff0c;里面的元素并行计算的集合。 Dataset&#xff1a; 一个数据集合&#xf…...

如何从windows中的cursor打开windows里面的wsl中的项目

解决方法&#xff1a; ✅ 步骤 1&#xff1a;在 Windows 中安装 Cursor 首先&#xff0c;确保你已在 Windows 上安装了 Cursor 编辑器。 安装完成后&#xff0c;打开 Cursor 编辑器。​ ✅ 步骤 2&#xff1a;安装并配置 WSL 扩展 为了让 Cursor 与 WSL 集成&#xff0c;需…...

UE5 C++项目实现单例

在 UE5 中,要实现“全局只有一个实例”的单例模式,主要有两种思路:一种是传统 C++ 静态单例,另一种是利用 UE5 提供的Subsystem体系(如 UGameInstanceSubsystem、UWorldSubsystem 等)。下面先给出核心示例代码及对比,随后讨论典型使用场景、优缺点,对常见问题作出诊断并…...

信息论04:从信息熵到互信息——信息共享的数学度量

从信息熵到互信息&#xff1a;信息共享的数学度量 1. 信息论基础概念 1.1 信息熵&#xff08;Information Entropy&#xff09; 定义&#xff1a;信息熵由香农提出&#xff0c;用于量化随机变量的不确定性。对于离散随机变量X&#xff0c;其熵定义为&#xff1a; H ( X ) …...

MYSQL的DDL语言和单表查询

MYSQL的DDL语言和单表查询 Mysql介绍 SQL&#xff08;Structured Query Language&#xff09;是一种专门用于管理和操作关系型数据库的标准化语言&#xff0c;通过定义、查询、更新和控制数据&#xff0c;为应用程序提供一致且高效的持久化存储方式。它包含数据定义语言&…...

奇瑞依托汽车产业链,实现服务机器人万台下线

近日&#xff0c;奇瑞集团旗下墨甲机器人&#xff08;MOJA&#xff09;全球批量交付的消息得到官方确认。这一重大进展不仅标志着奇瑞在服务机器人领域的商业化落地迈出关键一步&#xff0c;更成为国产智能装备进军全球市场的重要里程碑。 墨甲机器人简介 产品定位 墨甲是奇…...

Python Bug 修复案例分析:函数参数传递引发的逻辑错误修复

在 Python 编程学习的过程中&#xff0c;各种意想不到的 Bug 常常会阻碍我们编写的程序的正常运行。这次&#xff0c;我们将围绕一个因函数参数传递导致逻辑错误的案例&#xff0c;深入剖析 Bug 的修复全过程&#xff0c;帮助初学者掌握处理这类问题的方法。 案例背景 最近编写…...

论文阅读笔记——ROBOGROUND: Robotic Manipulation with Grounded Vision-Language Priors

RoboGround 论文 一类中间表征是语言指令&#xff0c;但对于空间位置描述过于模糊&#xff08;“把杯子放桌上”但不知道放桌上哪里&#xff09;&#xff1b;另一类是目标图像或点流&#xff0c;但是开销大&#xff1b;由此 GeoDEX 提出一种兼具二者的掩码。 相比于 GR-1&#…...

deeplabv3+街景图片语义分割,无需训练模型,看不懂也没有影响,直接使用,cityscapes数据集_23

目录 0、简介1、下载链接1.1、CSDN链接&#xff0c;含权重文件直接使用&#xff0c;建议直接下这个&#xff0c;还不限速。1.2 Github链接&#xff1a; 2、下载代码&#xff0c;下载预训练好的权重3、预测代码4、像素提取&#xff0c;或者说类别提取5、文档部分内容截图6、其他…...

JavaScript性能优化实战:深入探讨性能瓶颈与优化技巧

JavaScript性能优化实战:深入探讨性能瓶颈与优化技巧 引言 在当今快速发展的Web世界中,性能已经成为衡量应用质量的关键指标。随着Web应用复杂度的不断提升,JavaScript作为前端开发的核心语言,其性能优化变得尤为重要。本文旨在全面深入地探讨JavaScript性能优化的各个方…...

第2章——springboot核心机制

一、为何以继承方式引入SpringBoot 1.提出疑问 以前我们在开发项目时&#xff0c;需要什么&#xff0c;引入对应的依赖就行&#xff0c;比如我们需要连接mysql数据&#xff0c;则引入mysql驱动的依赖&#xff0c;如下&#xff1a; <dependency><groupId>com.mys…...

huggingface 热门开源TTS模型Dia-1.6B,支持多人对话生成、情感控制~

简介 Dia-1.6B 是一款由 Nari Labs 开发的开源文本转语音&#xff08;TTS&#xff09;模型&#xff0c;专注于生成自然对话。其项目背景和模型架构基于近期可用的网络信息进行了详细分析&#xff0c;以下是全面的报告。 项目背景概述 Dia-1.6B 的开发始于 Nari Labs&#xff…...

深入理解West:介绍、使用及与Repo的对比

目录 引言 West简介 West的由来 West的核心功能 West的架构与工作流程 West安装与使用 环境准备与安装 Manifest 文件结构解析 常用命令详解与进阶用法 Tip与Troubleshoot 实践案例:基于West的Zephyr项目管理 初始化与同步 构建与闪存 插件示例:自定义命令 Repo简介 Repo的背…...

力扣-hot100 (矩阵置零)

73. 矩阵置零 中等 给定一个 *m* x *n* 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,1,1],[1,0,1],[1,1,1]] 输出&#xff1a;[[1,0,1],[0,0,0],[1,0,1]] 示…...

OpenKylin安装Elastic Search8

一、环境准备 Java安装 安装过程此处不做赘述&#xff0c;使用以下命令检查是否安装成功。 java -version 注意&#xff1a;Elasticsearch 自 7.0 版本起内置了 OpenJDK&#xff0c;无需单独安装。但如需自定义 JDK&#xff0c;可设置 JAVA_HOME。 二、安装Elasticsearch …...

【JVM】从零开始深度解析JVM

本篇博客给大家带来的是JVM的知识点, 重点在类加载和垃圾回收机制上. &#x1f40e;文章专栏: JavaEE初阶 &#x1f680;若有问题 评论区见 ❤ 欢迎大家点赞 评论 收藏 分享 如果你不知道分享给谁,那就分享给薯条. 你们的支持是我不断创作的动力 . 王子,公主请阅&#x1f680; …...

制造企业PLM系统成本基准:2025年预算分配与资源成本率的5种优化模型

在 2025 年制造业数字化转型的浪潮中&#xff0c;PLM&#xff08;产品生命周期管理&#xff09;系统已成为制造企业提升核心竞争力的关键工具。然而&#xff0c;PLM 系统的实施和运营成本较高&#xff0c;如何有效控制成本、优化预算分配和资源成本率&#xff0c;成为企业关注的…...

【Python】一键提取视频音频并生成MP3的完整指南 by `MoviePy`

摘要 昨天&#xff0c; 我在让一个小朋友给我整理一次培训的视频的时候&#xff0c;我看到他把视频文件放到剪映里面处理。 我以为他要干什么呢&#xff0c; 还很期待&#xff0c;结果他只是为了导出音频而已。 于是就有了今天的这篇博客。 作为音视频处理领域的常用需求&…...

Golang领域Beego框架的中间件开发实战

在Golang的Beego框架中&#xff0c;中间件&#xff08;Middleware&#xff09;是一种强大的机制&#xff0c;用于在请求处理的不同阶段插入自定义逻辑。 中间件可以用于处理日志记录、身份验证、错误处理、请求/响应修改等任务。 Beego框架中间件开发的实战指南&#xff1a; …...

Elasticsearch:我们如何在全球范围内实现支付基础设施的现代化?

作者&#xff1a;来自 Elastic Kelly Manrique SWIFT 和 Elastic 如何应对基础设施复杂性、误报问题以及日益增长的合规要求。 金融服务公司在全球范围内管理实时支付方面面临前所未有的挑战。SWIFT&#xff08;Society for Worldwide Interbank Financial Telecommunication -…...

【LLIE专题】基于 CLIP 的无监督背光增强算法

CLIP-LIT: Iterative Prompt Learning for Unsupervised Backlit Image Enhancement&#xff08;2023&#xff0c;ICCV&#xff09; 专题介绍一、研究背景二、CLIP-LIT方法三、实验结果四、总结五、思考 本文将对 CLIP-LIT: Iterative Prompt Learning for Unsupervised Backl…...

深入了解酒店一次性牙刷:材质选择与设计考量全解析

酒店的一次性牙刷是我们住酒店时常见的用品&#xff0c;它方便了很多旅客出行&#xff0c;虽小巧&#xff0c;却对人们口腔清洁有一定作用&#xff0c;扬州卓韵酒店用品在这个领域表现优秀&#xff0c;下面我们就深入了解酒店一次性牙刷。 一次性牙刷的材质相当重要。常见的有…...

[人机交互]理解用户

一.解释什么是认知&#xff0c;以及它对交互设计的重要性 1.1什么是认知 认知是指与knowing相关的能力&#xff0c;行为和过程&#xff08;考填空&#xff09; -如何感知物理刺激&#xff1f;如注意、知觉等 -如何认识自我、他人以及环境&#xff1f;如意识、记忆等 -如何…...

css3伸缩盒模型第二章(侧轴相关)

css3伸缩盒模型第二章(侧轴相关) 侧轴对齐方式 侧轴对齐我们需要分两种情况&#xff0c;一种是多行&#xff0c;一种是单行&#xff0c;两种设置方式不同 属性&#xff1a;align-items 单行属性&#xff1a; align-content 多行 单行 align-items flex-start: 侧轴的起点对…...

【WPS】怎么解决“word的复制表格”粘贴到“excel的单元格”变多行单元格的问题

把 word文档复制表格到这个excel表格上面的话&#xff0c;会出现由单个单元格变成多行单元格的情况。 现在&#xff0c;就这个问题怎么解决&#xff0c;提出了一个方案&#xff0c;就是先查找是什么导致了这个换行&#xff0c;然后再将换行的这个字符进行一个整体的替换&#x…...

股指期货深度贴水是什么意思?

如果贴水的幅度特别大&#xff0c;比如股票指数是3000点&#xff0c;但股指期货的价格只有2800点&#xff0c;贴水了200点&#xff0c;这就叫“深度贴水”。简单来说&#xff0c;股指期货贴水就是指股指期货的价格低于其对应的现货指数价格。当这种贴水程度较大时&#xff0c;就…...