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

Android学习总结之kotlin篇(二)

扩展函数转成字节码的原理(源码级别)

        Kotlin 扩展函数在编译时会被转换为静态方法,这一过程涉及到以下几个关键步骤:

        首先,Kotlin 编译器会为包含扩展函数的包生成一个特定的类。这个类的命名通常是基于包名和文件名的组合(如果未指定文件名,则遵循默认规则)。例如,对于我们之前的示例 package com.example.extensions,生成的类可能类似于 com/example/extensions/StringExtensionsKt

        然后,扩展函数会被转换为这个类中的静态方法。在这个静态方法中,会有一个额外的参数,这个参数代表扩展函数的接收者对象,在字节码中通常被命名为 $this。以 fun String.reverseAndAppend(): String 这个扩展函数为例,生成的静态方法可能如下:

package com.example.extensions;public class StringExtensionsKt {public static String reverseAndAppend(String $this) {return new StringBuilder($this).reverse().toString() + "!";}
}

        最后,当在 Kotlin 代码中调用扩展函数时,例如 val input = "hello"; val result = input.reverseAndAppend();,编译后的字节码会将这个调用转换为对上述生成的静态方法的调用,就像这样:

import com.example.extensions.StringExtensionsKt;public class Main {public static void main(String[] args) {String input = "hello";String result = StringExtensionsKt.reverseAndAppend(input);}
}

总结来说,Kotlin 扩展函数的本质是编译期的语法糖,它通过将扩展函数调用转换为静态方法调用,在不修改原类字节码的情况下,实现了对原类功能的扩展。

Kotlin 协程挂起和恢复的原理(源码级别)

挂起函数的编译

Kotlin 中的挂起函数在编译时会被转换为带有 Continuation 参数的普通函数。Continuation 是一个接口,定义了协程挂起后恢复执行的回调方法。

以下是一个简单的挂起函数示例:

suspend fun fetchData(): String {delay(1000)return "Data fetched"
}

编译后的代码大致如下(简化表示):

fun <T> fetchData(continuation: Continuation<String>): Any? {// 状态机相关逻辑when (continuation.label) {0 -> {continuation.label = 1return suspendCoroutineUninterceptedOrReturn<String> { cont ->// 执行 delay 操作delayInternal(1000L, cont)}}1 -> {// 处理延迟完成后的逻辑val result = continuation.result as Unitreturn "Data fetched"}else -> throw IllegalStateException("Unexpected label")}
}

这里使用了状态机模式,continuation.label 用于记录协程的执行状态。当协程执行到 delay 函数时,会挂起协程并将状态机的状态设置为 1,等待延迟完成。

协程的挂起和恢复
  • 挂起:当协程执行到挂起函数时,会调用 suspendCoroutineUninterceptedOrReturn 函数。这个函数会将当前的 Continuation 对象传递给挂起操作(如 delayInternal),并返回一个特殊值(通常是 COROUTINE_SUSPENDED)表示协程已经挂起。
suspend fun delay(timeMillis: Long) {return suspendCoroutineUninterceptedOrReturn { cont ->// 启动一个延迟任务Timer().schedule(timeMillis) {cont.resume(Unit)}COROUTINE_SUSPENDED}
}
  • 恢复

            当挂起操作完成后,会调用 Continuation 的 resume 或 resumeWithException 方法。在上面的 delay 示例中,当延迟时间到达时,会调用 cont.resume(Unit) 方法,将控制权交还给协程,协程会根据状态机的状态继续执行。

     

            例如,在 Android 中发起网络请求时,协程会将 “请求完成后需要执行的代码” 封装到 Continuation 的回调里,然后立即返回一个特殊值(COROUTINE_SUSPENDED),告诉协程框架 “我现在挂起了,后续逻辑等回调触发”。此时,承载协程的线程(如主线程)会被释放,去处理其他任务(如 UI 绘制),不会阻塞。当网络响应返回时,协程框架会调用 Continuation.resume() 方法,将结果传递回协程,协程根据 Continuation 中保存的状态,从挂起点继续执行后续代码(如解析数据、更新 UI)。整个过程通过状态机(编译生成的 when (label) 分支)管理不同挂起阶段的逻辑,避免回调嵌套(回调地狱)。

     

            在 ViewModel 或 Activity 中使用协程处理耗时操作时,挂起机制确保主线程不阻塞,避免 ANR。例如,withContext(Dispatchers.Main) 能安全切换回主线程更新 UI,其底层原理就是通过 Continuation 记录 “恢复时需要在主线程执行” 的状态,由协程调度器(如 HandlerDispatcher)实现线程切换。

面试扩展:

一、Kotlin 扩展函数转字节码的原理

Kotlin 扩展函数的本质是 编译期语法糖,其核心原理可概括为:将对扩展函数的调用转换为静态方法调用,不修改原类字节码,仅通过编译生成新的静态方法实现功能扩展。

  1. 语法糖的本质
    扩展函数看似是给原有类(如 Android 中的 ContextView)“新增成员函数”,但 Kotlin 不支持真正修改已编译的类(如 Java 类)。编译时,扩展函数会被编译成一个 独立的静态方法,该方法的第一个参数是扩展函数的 “接收者对象”(即被扩展的类实例,如 Context),相当于把 obj.extensionFunc() 转换为 ExtensionClass.extensionFunc(obj, 参数)

  2. 字节码层面的实现
    例如,给 TextView 写一个扩展函数 fun TextView.showMessage(msg: String),编译后会生成一个包含静态方法的类(如 TextViewExtKt.showMessage(TextView $this, String msg)),$this 代表调用扩展函数的对象本身。运行时,Kotlin 代码中的扩展函数调用会直接转为对这个静态方法的调用,与普通静态方法无异。

  3. 对 Android 开发的意义
    这种机制让开发者能在不修改 Android 框架类(如 ActivityFragment)的前提下,为其添加便捷方法(如链式调用设置控件属性),同时保持与 Java 代码的兼容性(Java 代码可直接调用生成的静态方法)。

扩展函数是否真正修改了原类?

        扩展函数并没有真正修改原类。它的本质是一个静态方法,原类的字节码并不会因为扩展函数的存在而发生改变。扩展函数通过第一个参数传入接收者对象,从而实现对原类功能的扩展。

扩展函数能否访问原类的私有成员?

        扩展函数不能访问原类的私有成员。它只能访问原类的公共成员,这与普通静态方法的权限是一致的。

二、Kotlin 协程挂起与恢复的原理

Kotlin 协程的挂起与恢复是实现 非阻塞异步编程 的核心,其原理可总结为:通过状态机和 Continuation 接口,在挂起点保存执行状态,恢复时按状态继续执行,全程不阻塞线程。

  1. 挂起函数的本质
    挂起函数(suspend fun)在编译时会被转换为一个接受 Continuation 参数的函数。Continuation 是一个接口,用于记录协程的 执行状态和恢复逻辑,包含一个 resume 方法,当协程恢复时调用。

  2. 挂起过程(以网络请求为例)

    • 当协程执行到挂起函数(如 withContext(Dispatchers.IO) 或 delay())时,会暂停当前执行,将当前的 局部变量、执行位置等状态 保存到 Continuation 中。
    • 例如,在 Android 中发起网络请求时,协程会将 “请求完成后需要执行的代码” 封装到 Continuation 的回调里,然后立即返回一个特殊值(COROUTINE_SUSPENDED),告诉协程框架 “我现在挂起了,后续逻辑等回调触发”。
    • 此时,承载协程的线程(如主线程)会被释放,去处理其他任务(如 UI 绘制),不会阻塞
  3. 恢复过程(以请求完成为例)

    • 当挂起操作完成(如网络响应返回、延迟时间到达),协程框架会调用 Continuation.resume() 方法,将结果传递回协程。
    • 协程根据 Continuation 中保存的状态,从挂起点继续执行后续代码(如解析数据、更新 UI)。整个过程通过 状态机(编译生成的 when (label) 分支) 管理不同挂起阶段的逻辑,避免回调嵌套(回调地狱)。
  4. Android 中的关键应用

    • 在 ViewModel 或 Activity 中使用协程处理耗时操作时,挂起机制确保主线程不阻塞,避免 ANR。
    • withContext(Dispatchers.Main) 能安全切换回主线程更新 UI,其底层原理就是通过 Continuation 记录 “恢复时需要在主线程执行” 的状态,由协程调度器(如 HandlerDispatcher)实现线程切换。

三、面试高频考点总结

  1. 扩展函数的核心考点

    • 问:“扩展函数是否真正修改了原类?”
      答:否,本质是静态方法,原类字节码不变,通过第一个参数传入接收者对象。
    • 问:“扩展函数能否访问原类的私有成员?”
      答:不能,仅能访问原类的公共成员(与普通静态方法权限一致)。
  2. 协程挂起的核心考点

    • 问:“协程挂起为什么不阻塞线程?”
      答:挂起时通过 Continuation 保存状态并释放线程,恢复时由协程框架调度继续执行,线程可复用。
    • 问:“suspend 关键字的作用是什么?”
      答:标记函数为挂起函数,允许在其中使用挂起操作(如 delaywithContext),编译时生成带 Continuation 参数的状态机代码。

扩展追问:

当在 Java 代码中调用 Kotlin 可空参数函数并传入 null 时

1. Kotlin 函数参数为可空类型

若 Kotlin 函数的参数被定义成可空类型(类型后面带 ?),Java 代码传入 null 是允许的,并且不会引发异常。在 Kotlin 函数里,需要对传入的可空参数进行空检查。

以下是示例代码:

Kotlin 代码
// 定义一个参数为可空类型的函数
fun processNullableParam(name: String?) {if (name != null) {println("Name is: $name")} else {println("Name is null")}
}
Java 代码
public class JavaCallKotlin {public static void main(String[] args) {// 调用 Kotlin 可空参数函数并传入 nullMainKt.processNullableParam(null); }
}

在上述代码中,Kotlin 函数 processNullableParam 的参数 name 是可空类型 String?,Java 代码传入 null 时,Kotlin 函数会对 name 进行空检查,然后根据情况输出相应信息。

2. Kotlin 函数参数为非可空类型

如果 Kotlin 函数的参数定义为非可空类型(类型后面不带 ?),Java 代码传入 null 会在运行时抛出 NullPointerException。这是因为 Kotlin 的非可空类型在编译时会保证其不为 null,但 Java 没有这种严格的类型检查。

以下是示例代码:

Kotlin 代码
// 定义一个参数为非可空类型的函数
fun processNonNullParam(name: String) {println("Name is: $name")
}
Java 代码
public class JavaCallKotlin {public static void main(String[] args) {// 调用 Kotlin 非可空参数函数并传入 nullMainKt.processNonNullParam(null); }
}

在上述代码中,Kotlin 函数 processNonNullParam 的参数 name 是非可空类型 String,当 Java 代码传入 null 时,运行时会抛出 NullPointerException

总结

在 Java 调用 Kotlin 函数时,需要留意 Kotlin 函数参数的可空性。若参数为可空类型,传入 null 是安全的;若参数为非可空类型,传入 null 会在运行时抛出异常。

相关文章:

Android学习总结之kotlin篇(二)

扩展函数转成字节码的原理&#xff08;源码级别&#xff09; Kotlin 扩展函数在编译时会被转换为静态方法&#xff0c;这一过程涉及到以下几个关键步骤&#xff1a; 首先&#xff0c;Kotlin 编译器会为包含扩展函数的包生成一个特定的类。这个类的命名通常是基于包名和文件名的…...

QMK RGB矩阵灯效配置详解:从理论到实践(实操部分)

QMK RGB矩阵灯效配置详解:从理论到实践 引言 RGB灯效是现代机械键盘中一个非常吸引人的特性,通过QMK固件,我们可以实现丰富多彩的灯光效果。本文将详细讲解如何在QMK中配置RGB矩阵灯效,从基础理论到实际实现,帮助键盘爱好者打造专属的RGB键盘。无论你是刚开始接触QMK,还…...

知识图谱重构电商搜索:下一代AI搜索引擎的底层逻辑

1. 搜索引擎的进化论 从雅虎目录式搜索到Google的PageRank算法&#xff0c;搜索引擎经历了三次技术跃迁。而AI搜索引擎正在掀起第四次革命&#xff1a;在电商场景中&#xff0c;传统的「关键词匹配」已无法满足个性化购物需求&#xff0c;MOE搜索等新一代架构开始融合知识图谱…...

解密企业级大模型智能体Agentic AI 关键技术:MCP、A2A、Reasoning LLMs-强化学习算法

解密企业级大模型智能体Agentic AI 关键技术&#xff1a;MCP、A2A、Reasoning LLMs-强化学习算法 现在我们的核心问题是有一些同学会知道要才能强化学习。为什么才能强化学习&#xff1f;是实现AGI。例如从这个其实你从第一阶段开始以后&#xff0c;就是chatbot&#xff0c;这…...

嵌入式学习笔记 - SystemCoreClock/1000000

SystemClock 顾名思义就是系统时钟&#xff0c;位于时钟树如下中间位置&#xff0c;是PLL倍频后的部分&#xff0c;它不同于HCLK(SystemCoreClock), SystemCoreClock为系统内核时钟&#xff0c;也就是HCLK始终&#xff0c;也就是总线时钟&#xff0c;就是芯片内核运行的最终时…...

密西根大学新作——LightEMMA:自动驾驶中轻量级端到端多模态模型

导读 目前将自动驾驶与视觉语言模型&#xff08;VLMs&#xff09;结合的研究越来越火热&#xff0c;VLMs已经证明了其对自动驾驶的重要作用。本文引入了一种用于自动驾驶的轻量级端到端多模态模型LightEMMA&#xff0c;它能够集成和评估当前的商业和开源模型&#xff0c;以研究…...

MobiPDF:安卓设备上的专业PDF阅读与编辑工具

MobiPDF是一款专为安卓设备设计的PDF阅读和编辑工具&#xff0c;提供了丰富的功能&#xff0c;帮助用户在移动设备上轻松打开、阅读、批注和编辑PDF文件。无论是学生、专业人士还是普通用户&#xff0c;MobiPDF都能满足他们在移动设备上处理PDF文件的需求&#xff0c;提升工作效…...

印度尼西亚数据源对接技术指南

一、数据源全景概述 印度尼西亚作为东南亚最大经济体&#xff0c;其数据生态覆盖金融、产业、人口等多个维度。StockTV提供全链路印尼数据解决方案&#xff0c;涵盖以下核心领域&#xff1a; 数据类型覆盖范围更新频率典型应用场景金融市场数据IDX交易所股票/债券/衍生品实时…...

Apache Pulsar 消息、流、存储的融合

Apache Pulsar 消息、流、存储的融合 消息队列在大层面有两种不同类型的应用&#xff0c;一种是在线系统的message queue&#xff0c;一种是流计算&#xff0c;data pipeline的streaming高throughout&#xff0c;一致性较低&#xff0c;延迟较差的过程。 存算分离 扩容和缩容快…...

从零实现一个高并发内存池 - 2

上一篇https://blog.csdn.net/Small_entreprene/article/details/147904650?fromshareblogdetail&sharetypeblogdetail&sharerId147904650&sharereferPC&sharesourceSmall_entreprene&sharefromfrom_link 高并发内存池 - thread cache 一、基本结构与原…...

promise

handleFileChange(event) {var that this;// 处理文件上传并传递回调函数this.$commonJS.handleFileUpload(event, function (tables) {console.log(tables at line 786:, tables);// 使用 Promise.all 等待所有表格解析完成Promise.all(tables.map((table) > {return new …...

Django + Celery 打造企业级大模型异步任务管理平台 —— 从需求到完整实践(含全模板源码)

如需完整工程文件(含所有模板),可回复获取详细模板代码。 面向人群:自动化测试工程师、企业中后台开发人员、希望提升效率的 AI 业务从业者 核心收获:掌握 Django 三表关系设计、Celery 异步任务实践、基础 Web 交互与前后端分离思路,源码可直接落地,方便二次扩展 一、系…...

从零开始完成“大模型在牙科诊所青少年拉新系统中RAG与ReACT功能实现”的路线图

项目核心目标&#xff1a; 构建一个智能系统&#xff0c;利用大型语言模型&#xff08;LLM&#xff09;、检索增强生成&#xff08;RAG&#xff09;和推理与行动&#xff08;ReACT&#xff09;技术&#xff0c;通过七个专门的知识向量库&#xff0c;为牙科诊所精准吸引青少年客…...

c# 倒序方法

在C#中&#xff0c;有几种方法可以对List进行倒序排列&#xff1a; 1. 使用List的Reverse()方法&#xff08;原地反转&#xff09; List<int> numbers new List<int> { 1, 2, 3, 4, 5 };numbers.Reverse(); // 直接修改原列表// 结果&#xff1a;5, 4, 3, 2, 1 …...

【!!!!终极 Java 中间件实战课:从 0 到 1 构建亿级流量电商系统全链路解决方案!!!!保姆级教程---超细】

终极 Java 中间件实战课&#xff1a;电商系统架构实战教程 电商系统架构实战教程1. 系统架构设计1.1 系统模块划分1.2 技术选型 2. 环境搭建2.1 开发环境准备2.2 基础设施部署 3. 用户服务开发3.1 创建Maven项目3.2 创建用户服务模块3.3 配置文件3.4 实体类与数据库设计3.5 DAO…...

HarmonyOs开发之———使用HTTP访问网络资源

谢谢关注&#xff01;&#xff01; 前言&#xff1a;上一篇文章主要介绍HarmonyOs开发之———Video组件的使用:HarmonyOs开发之———Video组件的使用_华为 video标签查看-CSDN博客 HarmonyOS 网络开发入门&#xff1a;使用 HTTP 访问网络资源 HarmonyOS 作为新一代智能终端…...

Java Queue 接口实现

Date: 2025.05.14 20:46:38 author: lijianzhan Java中的Queue接口是位于java.util包中&#xff0c;它是一个用于表示队列的接口。队列是一种先进先出&#xff08;First-In-First-Out, 简称为FIFO&#xff09;的数据结构&#xff0c;其中元素被添加到队列的尾部&#xff0c;并从…...

【IDEA】注释配置

1. IDEA注释调整&#xff0c;去掉默认在第一列显示 修改为如下&#xff1a; 2. IDEA中修改代码中的注释颜色...

day25 python异常处理

目录 Python 的异常处理机制 核心概念 常见的异常处理结构 try-except try-except-else 常见异常类型 SyntaxError&#xff08;语法错误&#xff09; NameError&#xff08;名称错误&#xff09; TypeError&#xff08;类型错误&#xff09; ValueError&#xff08;值…...

【测试】BUG

目录 1、描述BUG的要素&#xff1a; 2、BUG的级别 3、BUG的状态的流转 4、与开发产⽣争执怎么办&#xff08;⾼频考题&#xff09; 什么是BUG&#xff1f;&#xff1f;&#xff1f; 程序与规格说明之间的不匹配才是错误 1、描述BUG的要素&#xff1a; 问题出现的版本、问…...

Java面向对象三大特性深度解析

Java面向对象三大特性封装继承多态深度解析 前言一、封装&#xff1a;数据隐藏与访问控制的艺术1.1 封装的本质与作用1.2 封装的实现方式1.2.1 属性私有化与方法公开化1.2.2 封装的访问修饰符 二、继承&#xff1a;代码复用与类型扩展的核心机制2.1 继承的定义与语法2.2 继承的…...

C 语言学习笔记(8)

内容提要 数组 数组的概念一维数组 数组 数组的概念 什么是数组 数组是相同类型&#xff0c;有序数据的集和 数组的特征 数组中的数据被称之为数组的元素&#xff08;所谓的元素&#xff0c;其实就是数组的每一个匿名的变量空间&#xff09;&#xff0c;是同构。数组中的…...

Screen Mirroring App:轻松实现手机与电视的无缝投屏

Screen Mirroring App 是一款由2kit consulting发行的电视投屏软件&#xff0c;专为用户提供便捷的投屏解决方案。它支持将手机和平板屏幕上的内容实时投射到大电视上&#xff0c;无论是观看影视作品、玩游戏、浏览照片还是阅读电子书&#xff0c;都能提供清晰、稳定的画质和流…...

html js 原生实现web组件、web公共组件、template模版插槽

在现代浏览器中&#xff0c;通过 class 继承 HTMLElement 可以轻松创建原生 Web Components&#xff08;自定义元素&#xff09;&#xff0c;并能享受与普通 HTML 元素同等的语义和性能优势。下面将从核心概念、生命周期方法、Shadow DOM、表单关联、自定义属性、以及与 Vue 3 …...

【爬虫】DrissionPage-2

之前的三个对象是4.0版本&#xff0c;看到的是网上大佬们网上的文章&#xff0c;因为看到官网更新了4.1&#xff0c;我觉得有必要了解一下&#xff1a;文档地址&#xff1a;&#x1f4a5; 4.1 功能介绍 | DrissionPage官网 点击链接看官网就行&#xff0c;下面一样的。 4.1 的…...

鸿蒙OSUniApp 制作个人信息编辑界面与头像上传功能#三方框架 #Uniapp

UniApp 制作个人信息编辑界面与头像上传功能 前言 最近在做一个社交类小程序时&#xff0c;遇到了需要实现用户资料编辑和头像上传的需求。这个功能看似简单&#xff0c;但要做好用户体验和兼容多端&#xff0c;还是有不少细节需要处理。经过一番摸索&#xff0c;总结出了一套…...

系统漏洞扫描服务:维护网络安全的关键与服务原理?

系统漏洞扫描服务是维护网络安全的关键措施&#xff0c;能够迅速发现系统中的潜在风险&#xff0c;有效预防可能的风险和损失。面对网络攻击手段的日益复杂化&#xff0c;这一服务的重要性日益显著。 服务原理 系统漏洞扫描服务犹如一名恪尽职守的安全守护者。它运用各类扫描…...

[原创](现代C++ Builder 12指南): 在界面开发中, 如何利用C++高级特性“折叠表达式“?.

[序言] 在现代C++编程中, 现代C++引入的折叠表达式(Fold Expressions)是一项极具价值的特性, 它为模板编程带来了更高的灵活性和简洁性. 折叠表达式允许在参数包上执行简洁的折叠操作, 从而减少冗余代码, 提升代码的可读性与维护性. 在界面开发领域, 特别是使用C++ Builder 12进…...

KUKA机器人中断编程3—暂停功能的编程

在KUKA机器人的使用过程中&#xff0c;对于调试一个项目&#xff0c;当遇到特殊情况时需要暂停机器人&#xff0c;等异常情况处理完成后再继续机器人的程序运行。wait for指令是等待一个输入信号指令&#xff0c;没有输入信号&#xff0c;机器人一直等待。在一定程度上程序也不…...

【LeetCode 热题 100】反转链表 / 回文链表 / 有序链表转换二叉搜索树 / LRU 缓存

⭐️个人主页&#xff1a;小羊 ⭐️所属专栏&#xff1a;LeetCode 热题 100 很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~ 目录 相交链表反转链表回文链表环形链表环形链表 II合并两个有序链表两数相加删除链表的倒数第 N 个结点两两交换链表中的…...

Seata源码—1.Seata分布式事务的模式简介

大纲 1.Seata分布式事务框架简介 2.Seata AT模式实现分布式事务的机制 3.Seata AT模式下的写隔离机制 4.Seata AT模式下的读隔离机制 5.官网示例说明Seata AT模式的工作机制 6.Seata TCC模式的介绍以及与AT模式区别 7.Seata Saga模式的介绍 8.单服务多个库的分布式事务…...

牛客——签到题

分析 我拿到题就去看了示例&#xff0c;可以发现&#xff0c;并非是让难度最小&#xff0c;或者难度系数出现次数最多的成为签到题的难度。那我就有点懵了。。。。。。 但仔细观察题目本身的特定条件和目标&#xff0c;即在满足选择 m 道题的前提下&#xff0c;尽可能多地选择…...

【idea】调试篇 idea调试技巧合集

前言&#xff1a;之前博主写过一篇idea技巧合集的文章&#xff0c;由于技巧过于多了&#xff0c;文章很庞大&#xff0c;所以特地将调试相关的技巧单独成章, 调试和我们日常开发是息息相关的&#xff0c;用好调试可以事半功倍 文章目录 1. idea调试异步线程2. idea调试stream流…...

k8s监控方案实践补充(一):部署Metrics Server实现kubectl top和HPA支持

k8s监控方案实践补充&#xff08;一&#xff09;&#xff1a;部署Metrics Server实现kubectl top和HPA支持 文章目录 k8s监控方案实践补充&#xff08;一&#xff09;&#xff1a;部署Metrics Server实现kubectl top和HPA支持一、Metrics Server简介二、Metrics Server实战部署…...

直流电机风速仪

在处理直流电机风速仪的 ADC 读取问题时&#xff0c;下面为你详细介绍实现方法。 硬件连接 风速仪的输出通常是模拟信号&#xff0c;所以需要把它连接到微控制器的 ADC 输入引脚。比如&#xff0c;在 Arduino 上可以连接到 A0 - A5 这类模拟输入引脚。 ADC 读取原理 风速仪…...

dify 连接不上ollama An error occurred during credentials validation:

三大报错 An error occurred during credentials validation: HTTPConnectionPool(hosthost.docker.internal, port11434): Max retries exceeded with url: /api/chat (Caused by NameResolutionError("<urllib3.connection.HTTPConnection object at 0x7f26fc3c00b0&…...

19、云端工业物联网生态组件 - 工厂能效与预测维护 - /数据与物联网组件/cloud-iiot-factory-analysis

76个工业组件库示例汇总 云端工业物联网生态组件 - 工厂能效与预测维护 (模拟) 概述 这是一个交互式的 Web 组件&#xff0c;旨在模拟一个云端工业物联网 (IIoT) 平台的核心界面&#xff0c;专注于工厂层面的能效分析和基于传感器数据的预测性维护概念。用户可以监控模拟的设…...

python打卡day25

python的异常处理机制 知识点回顾&#xff1a; 异常处理机制debug过程中的各类报错try-except机制try-except-else-finally机制 在即将进入深度学习专题学习前&#xff0c;我们最后差缺补漏&#xff0c;把一些常见且重要的知识点给他们补上&#xff0c;加深对代码和流程的理解。…...

Jmeter变量传递介绍

文章目录 一、Jmeter变量类型及作用域二、变量传递方式1. 用户定义变量&#xff08;User Defined Variables&#xff09;2. CSV 数据文件&#xff08;CSV Data Set Config&#xff09;3.正则表达式提取器4.后置处理器&#xff08;Post Processor)4.1BeanShell/JSR223 后置处理器…...

机器学习 Day16 聚类算法 ,数据降维

聚类算法 1.简介 1.1 聚类概念 无监督学习&#xff1a;聚类是一种无监督学习算法&#xff0c;不需要预先标记的训练数据 相似性分组&#xff1a;根据样本之间的相似性自动将样本归到不同类别 相似度度量&#xff1a;常用欧式距离作为相似度计算方法 1.2 聚类vs分类 聚类&…...

白日梦:一个方便快捷的将故事制作成视频的工具

我有故事&#xff0c;但我想把它制作成视频&#xff0c;有没有什么好用的工具可以使用呢&#xff1f;如果你也被类似的问题困扰&#xff0c;那么今天分享的这个工具将会解决这个问题。从需求来看&#xff0c;我们希望的是纯文本的故事输入&#xff0c;完整的故事视频输出&#…...

ultralytics中tasks.py---parse_model函数解析

一、根据scale获取对应的深度、宽度和最大通道数 具体例如yaml文件内容如下: depth=0.33,那么重复的模块例如C2f原本重复次数是3,6,6,3,那么T对应的模型重复次数就是三分之一即1,1,2,1次。这个在后面定义的: width=0.25,max_channels=1024 原本c2=64,但经过make_div…...

Codeforces Round 1003 (Div. 4)

A. Skibidus and Amog’u 题目大意 给你一个字符串&#xff0c;把末尾的us换成i 解题思路 删掉最后两个加上“i”即可 代码实现 #include <bits/stdc.h>using i64 long long;int main() {std::ios::sync_with_stdio(false);std::cin.tie(0);std::cout.tie(0);int …...

基于RFSOC ZU28DR+DSP 6U VPX处理板

板卡概述 基于RFSOC ZU28DRDSP 6U VPX处理板&#xff0c;是一款基于6U VPX总线架构的高速信号处理平台&#xff0c;数模混合信号处理卡&#xff0c;采用 Xilinx ZYNQ UltraScale RFSoC ZU28DR和TI DSP TMS320C6678组合设计&#xff0c;两者之间通过4x 5G SRIO互联。本板卡可实…...

C# 通过脚本实现接口

以前C#脚本用的委托注入模式&#xff0c;今天在AI提示下&#xff0c;尝试用脚本直接实现接口&#xff0c;然后C#可以动态或指定新类型创建接口实现对象。从代码角度看&#xff0c;稍显复杂&#xff0c;但脚本方面显得更简洁和有条理。 引用包需要Microsoft.CodeAnalysis、Micro…...

代码随想录算法训练营Day58

力扣695.岛屿的最大面积【medium】 力扣827.最大人工岛【hard】 一、力扣695.岛屿的最大面积【medium】 题目链接&#xff1a;力扣695.岛屿的最大面积 视频链接&#xff1a;代码随想录 1、思路 和岛屿数量那道题很像&#xff0c;只是递归这边要多一个怎么计算面积&#xff0c…...

若依框架页面

1.页面地址 若依管理系统 2.账号和密码 管理员 账号admin 密码admin123 运维 账号yuwei 密码123456 自己搭建的地址方便大家学习&#xff0c;不要攻击哦&#xff0c;谢谢啊...

redis 缓存穿透,缓存击穿,缓存雪崩

一&#xff1a;什么是缓存 &#xff08;1&#xff09;计算机&#xff1a;cpu、内存、磁盘&#xff0c;cpu任何需要的数据都要从内容中读入数据放入cpu,从cup内部添加一个缓存 &#xff08;2&#xff09;web开发的每个阶段都可以添加缓存 &#xff08;3&#xff09;缓存优缺点&a…...

ORACLE查看归档是否打开

一、使用V$DATABASE视图 SELECT log_mode FROM v$database; 结果说明&#xff1a; ARCHIVELOG - 数据库处于归档模式 NOARCHIVELOG - 数据库处于非归档模式 二、 使用v$instance视图 SELECT archiver FROM v$instance; 结果说明&#xff1a; STARTED - 归档进程已启动(归档模…...

Python环境管理工具深度指南:pip、Poetry、uv、Conda

Python环境管理工具深度指南&#xff1a;pip、Poetry、uv、Conda Python开发中&#xff0c;环境管理和依赖管理是不可避开的重要话题。合理地管理项目的Python环境&#xff08;尤其是虚拟环境&#xff09;有助于隔离不同项目的依赖&#xff0c;避免版本冲突&#xff0c;并确保…...