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

Jetpack Compose 学习笔记(一)—— 快速上手

本篇主要是对 Jetpack Compose 有一个宏观上的了解。

1、Jetpack Compose 是什么与优势

Jetpack Compose 是用于构建原生 Android 界面的新工具包。它使用更少的代码、强大的工具和直观的 Kotlin API,可以帮助您简化并加快 Android 界面开发。

Compose 的优势(为何采用 Compose):

  • 更少的代码:使用更少的代码实现更多的功能,并且可以避免各种 bug,从而使代码简洁且易于维护
  • 直观:只需描述界面,Compose 会负责处理剩余的工作。应用状态变化时,界面会自动更新
  • 加快应用开发:兼容性现有的所有代码,方便随时采用。借助实时预览和全面的 Android Studio 支持,实现快速迭代
  • 功能强大:凭借对 Android 平台 API 的直接访问和对于 Material Design、深色主题、动画等的内置支持,创建精美的应用

2、Jetpack Compose 入门教程

主要内容来自于 Google 官方的 《Jetpack Compose 教程》。

2.1 Composable 函数与预览

Jetpack Compose 围绕可组合函数构建。这些函数可让您以程序化方式定义应用的界面,只需描述应用界面的外观并提供数据依赖项,而不必关注界面的构建过程(初始化元素、将其附加到父项等)。如需创建可组合函数,只需将 @Composable 注解添加到函数名称中即可。

比如定义一个展示文本的可组合函数:

// 注意,可组合函数首字母要大写
@Composable
fun MessageCard(name: String) {Text(text = "Hello, $name")
}

假如想要预览 UI 效果,可以在可组合函数上添加 @Preview 注解,但是不能直接在原来的可组合函数上加,而是在一个新的函数中调用这个可组合函数:

@Preview
@Composable
fun PreviewMessageCard() {MessageCard(name = "Android")
}

这样在代码编辑区的右上角切换到 Split 或 Design Tab 上,可以看到实时的 UI 预览。

2.2 布局

在 Compose 中,您可以通过从可组合函数中调用其他可组合函数来构建界面层次结构。

如果想为 MessageCard 内添加多个 Text,需要借助 Column 将两个 Text 垂直纵向排列:

fun MessageCard(message: Message) {Column {Text(text = message.author)Text(text = message.body)}
}data class Message(val author: String, val body: String)

如不使用 Column,两个 Text 将会重叠在一起。

水平方向布局使用 Row,再次更新 MessageCard 为其在两个文字的左侧添加一张图片:

@Composable
fun MessageCard(message: Message) {Row {Image(painter = painterResource(id = R.drawable.ic_launcher_foreground),contentDescription = "Contact profile picture")Column {Text(text = message.author)Text(text = message.body)}}
}

为了装饰或配置可组合项,Compose 使用了修饰符。通过修饰符,您可以更改可组合项的大小、布局、外观,还可以添加高级互动,例如使元素可点击。您可以将这些修饰符链接起来,以创建更丰富的可组合项。

fun MessageCard(message: Message) {// 设置四个方向的内边距为 8dpRow(modifier = Modifier.padding(all = 8.dp)) {Image(painter = painterResource(id = R.drawable.ic_launcher_foreground),contentDescription = "Contact profile picture",// 设置图片大小为 40dp 并进行圆形剪裁modifier = Modifier.size(40.dp).clip(CircleShape))// 图片与右侧 Column 的水平间距 8dpSpacer(modifier = Modifier.width(8.dp))Column {Text(text = message.author)// 两个 Text 之间的纵向距离 4dpSpacer(modifier = Modifier.height(4.dp))Text(text = message.body)}}
}

效果图:

2024-9-18.布局修饰符效果

2.3 Material Design

Compose 旨在支持 Material Design 原则。它的许多界面元素都原生支持 Material Design。Material Design 是围绕 Color(颜色)Typography(排版)Shape(形状) 这三大要素构建的。下面逐一添加这些要素。

MaterialTheme 提供已经封装好的主题样式:

  • MaterialTheme.colorScheme 封装了颜色值,比如设置图片边框颜色时,使用 MaterialTheme.colorScheme.primary
  • MaterialTheme.typography 提供了排版样式,为组件的 style 属性提供排版值,如 MaterialTheme.typography.titleSmall
  • MaterialTheme.shapes 提供形状,用于 Surface 可组合项

下面来看如何使用上述属性,还是在 MessageCard 上继续添加:

@Composable
fun MessageCard(message: Message) {Row(modifier = Modifier.padding(all = 8.dp)) {Image(painter = painterResource(id = R.drawable.ic_launcher_foreground),contentDescription = "Contact profile picture",modifier = Modifier.size(40.dp).clip(CircleShape)// 为图片添加边框,颜色使用 MaterialTheme.colorScheme.primary.border(1.5.dp, MaterialTheme.colorScheme.primary, CircleShape))Spacer(modifier = Modifier.width(8.dp))Column {Text(text = message.author,// 颜色color = MaterialTheme.colorScheme.secondary,// 排版style = MaterialTheme.typography.titleSmall)Spacer(modifier = Modifier.height(4.dp))// Surface 指定形状,包含 TextSurface(shape = MaterialTheme.shapes.medium, shadowElevation = 1.dp) {Text(text = message.body,modifier = Modifier.padding(all = 4.dp),// 排版style = MaterialTheme.typography.bodyMedium)}}}
}

经过上述属性的添加,再次预览 UI 效果:

2024-9-18.添加MD后的效果

2.4 深色主题

您可以启用深色主题(或夜间模式),以避免显示屏过亮(尤其是在夜间),或者只是节省设备电量。由于支持 Material Design,Jetpack Compose 默认能够处理深色主题。使用 Material Design 颜色、文本和背景时,系统会自动适应深色背景。

首先,使用在项目中创建的 Material 主题 JetpackComposeTheme(默认创建的主题名字就是项目名 + Theme) 和 Surface 来封装 MessageCard 函数。 在 @PreviewsetContent 函数中都需要执行此操作。这样一来,可组合项即可沿用应用主题中定义的样式,从而在整个应用中确保一致性:

	override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContent {JetpackComposeTheme {Surface {MessageCard(message = Message("Android", "Jetpack Compose"))}}}}

当系统切换为深色模式时,整个 MessageCard 的布局都会切换为深色:

2024-9-18.深色主题1

但假如你不用 Surface 封装 MessageCard 函数,就只有原本就被 Surface 封装的 “Jetpack Compose” 这个 Text 会切换,其余不会:

2024-9-18.深色主题2

所以前面才说要被 Surface 封装。

除了在真机上运行查看效果,还可以通过为可组合函数添加多个 @Preview 注解进行预览:

@Preview(name = "Light Mode")
@Preview(name = "Dark Mode", uiMode = Configuration.UI_MODE_NIGHT_YES, showBackground = true)
@Composable
fun PreviewMessageCard() {JetpackComposeTheme {Surface {MessageCard(message = Message("Android", "Jetpack Compose"))}}
}

预览界面会为每一个 @Preview 注解生成一个预览图:

2024-9-18.深色主题3

浅色和深色主题的颜色选项是在由 IDE 生成的 Theme.kt 文件中定义的:

private val DarkColorScheme = darkColorScheme(primary = Purple80,secondary = PurpleGrey80,tertiary = Pink80
)private val LightColorScheme = lightColorScheme(primary = Purple40,secondary = PurpleGrey40,tertiary = Pink40/* Other default colors to overridebackground = Color(0xFFFFFBFE),surface = Color(0xFFFFFBFE),onPrimary = Color.White,onSecondary = Color.White,onTertiary = Color.White,onBackground = Color(0xFF1C1B1F),onSurface = Color(0xFF1C1B1F),*/
)

2.5 列表与动画

Compose 可以轻松创建列表并添加有趣的动画效果:

  • 创建消息列表
  • 在展开消息时显示动画效果

消息列表的内容在 Google 教程页面提供了下载链接,内容如下:

/*** SampleData for Jetpack Compose Tutorial */
object SampleData {// Sample conversation dataval conversationSample = listOf(Message("Lexi","Test...Test...Test..."),Message("Lexi","""List of Android versions:|Android KitKat (API 19)|Android Lollipop (API 21)|Android Marshmallow (API 23)|Android Nougat (API 24)|Android Oreo (API 26)|Android Pie (API 28)|Android 10 (API 29)|Android 11 (API 30)|Android 12 (API 31)""".trim()),Message("Lexi","""I think Kotlin is my favorite programming language.|It's so much fun!""".trim()),Message("Lexi","Searching for alternatives to XML layouts..."),Message("Lexi","""Hey, take a look at Jetpack Compose, it's great!|It's the Android's modern toolkit for building native UI.|It simplifies and accelerates UI development on Android.|Less code, powerful tools, and intuitive Kotlin APIs :)""".trim()),Message("Lexi","It's available from API 21+ :)"),Message("Lexi","Writing Kotlin for UI seems so natural, Compose where have you been all my life?"),Message("Lexi","Android Studio next version's name is Arctic Fox"),Message("Lexi","Android Studio Arctic Fox tooling for Compose is top notch ^_^"),Message("Lexi","I didn't know you can now run the emulator directly from Android Studio"),Message("Lexi","Compose Previews are great to check quickly how a composable layout looks like"),Message("Lexi","Previews are also interactive after enabling the experimental setting"),Message("Lexi","Have you tried writing build.gradle with KTS?"),)
}

接下来新建一个可组合函数 Conversation,使用 LazyColumn 展示 Message 列表:

@Composable
fun Conversation(messages: List<Message>) {LazyColumn {items(messages) { message ->MessageCard(message)}}
}

LazyColumn 与 LazyRow 这些可组合项只会呈现屏幕上显示的元素,因此,对于较长的列表,使用它们会非常高效。

这样 MessageCard 列表就显示在屏幕上了,接下来,我们想实现点击 MessageCard 将消息展开/收起的效果:

@Composable
fun MessageCard(message: Message) {Row(modifier = Modifier.padding(all = 8.dp)) {Image(painter = painterResource(id = R.drawable.profile_picture),contentDescription = "Contact profile picture",modifier = Modifier.size(40.dp).clip(CircleShape).border(1.5.dp, MaterialTheme.colorScheme.primary, CircleShape))Spacer(modifier = Modifier.width(8.dp))// 持续追踪是否展开var isExpanded by remember { mutableStateOf(false) }// 每次点击就修改 isExpandedColumn(modifier = Modifier.clickable { isExpanded = !isExpanded }) {Text(text = message.author,color = MaterialTheme.colorScheme.secondary,style = MaterialTheme.typography.titleSmall)Spacer(modifier = Modifier.height(4.dp))Surface(shape = MaterialTheme.shapes.medium, shadowElevation = 1.dp) {Text(text = message.body,modifier = Modifier.padding(all = 4.dp),style = MaterialTheme.typography.bodyMedium,// 如果展开,展示全部内容maxLines = if (isExpanded) Int.MAX_VALUE else 1)}}}
}

效果图如下:

2024-09-18.显式与隐藏Message内容

上面涉及到的主要知识点就是 Compose 的状态 API remember 和 mutableStateOf。简单说,remember 就是开辟空间来保存变量的,只有 isExpanded 通过 remember 将变量值保存起来,这样在遇到重绘或者页面重建的情况下,重新调用 MessageCard 时,isExpanded 的值才不会丢失。配合 mutableStateOf 来改变 UI 状态,可以实现 UI 跟随状态变化而自动更新。

有关状态 API 的详细内容会在后续详解。

使用 remember 时需要注意,需要添加以下导入内容才能正确使用 Kotlin 的 委托属性语法(by 关键字)。按 Alt+Enter 键或 Option+Enter 键即可添加这些内容 :

  • import androidx.compose.runtime.getValue
  • import androidx.compose.runtime.setValue

最后为展开添加动画效果:

@Composable
fun MessageCard(message: Message) {Row(modifier = Modifier.padding(all = 8.dp)) {Image(painter = painterResource(id = R.drawable.profile_picture),contentDescription = "Contact profile picture",modifier = Modifier.size(40.dp).clip(CircleShape).border(1.5.dp, MaterialTheme.colorScheme.primary, CircleShape))Spacer(modifier = Modifier.width(8.dp))var isExpanded by remember { mutableStateOf(false) }// 指定 Surface 的颜色val surfaceColor by animateColorAsState(if (isExpanded) MaterialTheme.colorScheme.primary else MaterialTheme.colorScheme.surface)Column(modifier = Modifier.clickable { isExpanded = !isExpanded }) {Text(text = message.author,color = MaterialTheme.colorScheme.secondary,style = MaterialTheme.typography.titleSmall)Spacer(modifier = Modifier.height(4.dp))Surface(shape = MaterialTheme.shapes.medium,shadowElevation = 1.dp,// Surface 的颜色会渐变color = surfaceColor,// animateContentSize 会逐渐变化 Surface 大小(圆角)modifier = Modifier.animateContentSize().padding(1.dp)) {Text(text = message.body,modifier = Modifier.padding(all = 4.dp),style = MaterialTheme.typography.bodyMedium,maxLines = if (isExpanded) Int.MAX_VALUE else 1)}}}
}

效果图:

2024-09-18.显式与隐藏Message内容动画

3、深入详解 Compose 优化 UI 构建

3.1 Compose 所解决的问题

首先,在编写可维护的软件时,我们的目标是最大程度的减少耦合并增加内聚。因为高耦合意味着一处改,处处改,而高内聚意味着改一处足矣。

其次,尽可能的将相关的代码组织到一起,以便可以轻松的维护,并且方便随着应用规模的增长而扩展代码,这个称为关注点分离

2024-9-18.耦合与内聚

以 ViewModel 与布局文件为例,二者之间是存在许多耦合的:

2024-9-18.ViewModel与layout之间的耦合

即便让业务代码与布局使用不同语言强制它们分离,但是它们之间的联系仍然紧密:

2024-9-18.两种语言or一种语言

既然使用两种语言也会耦合,那么使用同一种语言会有怎样的好处:

2024-9-18.使用同一种语言

比如,想要在页面展示一个列表,那么需要在布局文件中增加一个 RecyclerView,然后在 Java/Kotlin 代码中增加一个适配器,适配器内又要写考虑条目的布局,又要去搞 XML……这样使得逻辑在业务代码和布局代码中来回穿插。但如果使用相同语言的 Kotlin 进行布局,就像下面这样简单:

@Composable
fun Conversation(messages: List<Message>) {LazyColumn {items(messages) { message ->MessageCard(message)}}
}

那么外界使用时无需关心布局具体的细节,只需传入参数 messages 即可实现想要的功能。当然,框架会降低耦合,而不会变成零耦合,因为 UI 上肯定多多少少都会带一点逻辑的。

2024-9-18.Composable函数实现关注点分离

Composable 函数剖析:

2024-9-18.Composable函数剖析

3.2 声明式 UI

2024-9-18.声明式UI1

使用命令式:

2024-9-18.使用命令式

使用声明式:

2024-9-18.使用声明式

声明式的含义:

2024-9-18.声明式的含义

3.3 组合 vs 继承

2024-9-18.组合vs继承

继承存在限制:

2024-9-18.继承的限制

组合的做法:

2024-9-18.组合1

2024-9-18.组合2

2024-9-18.组合3

2024-9-18.组合4

再来看装饰类型的抽象:

2024-9-18.装饰类型的抽象

使用 Compose 解决:

2024-9-18.装饰类型的抽象1

在 Java 的设计中,组合由于继承。因此 Compose 使用组合更有利于自定义控件。

3.4 重组

在后续讲状态等多个地方都会介绍到重组,它可以理解为界面的重绘。由于 Composable 函数是可以重启的,因此可以利用这一点实现界面的局部刷新:

2024-9-18.重组1

使用 Compose,就无需回调函数以及数据订阅等等即可更新在数据发生变化时更新 UI:

2024-9-18.重组2

总结:

2024-9-18.总结

相关文章:

Jetpack Compose 学习笔记(一)—— 快速上手

本篇主要是对 Jetpack Compose 有一个宏观上的了解。 1、Jetpack Compose 是什么与优势 Jetpack Compose 是用于构建原生 Android 界面的新工具包。它使用更少的代码、强大的工具和直观的 Kotlin API&#xff0c;可以帮助您简化并加快 Android 界面开发。 Compose 的优势&am…...

【大模型】7 天 AI 大模型学习

7 天 AI 大模型学习 Day 2 今天是 7 天AI 大模型学习的第二天 &#x1f604;&#xff0c;今天我将会学习 Transformer 、Encoder-based and Decoder-Based LLMs 等 。如果有感兴趣的&#xff0c;就和我一起开始吧 &#xff5e; 课程链接 &#xff1a;2025年快速吃透AI大模型&am…...

JVM对象创建过程

1 类加载检查 jvm通过new指令开始创建对象jvm执行new指令时&#xff0c;首先通过指令参数从常量池中取到需要创建的类名检查该类是否被加载&#xff0c;解析&#xff0c;和初始化过如果没有&#xff0c;则执行类的加载过程new指令对应到java语言具体的操作为 new 关键字创建对象…...

OSPF - SPF算法简述

SPF全称最短路径树算法&#xff0c;相信学过数据结构朋友应该看起来很熟悉  在一个区域内的路由器都会产生描述自己网络连接信息的LSA&#xff0c;包括两种信息&#xff0c;有路由信息和拓扑信息&#xff0c;简单的来说拓扑信息就是我连着谁&#xff0c;路由信息就是链路的地址…...

[实用指南]如何将视频从iPhone传输到iPad

概括 将视频从 iPhone 传输到 iPad 时遇到问题&#xff1f;您可能知道一种方法&#xff0c;但不知道如何操作。此外&#xff0c;您要传输的视频越大&#xff0c;完成任务就越困难。那么如何将视频从 iPhone 传输到 iPad&#xff0c;特别是当您需要发送大视频文件时&#xff1f…...

如何二次封装组件(vue3版本)

在开发 Vue 项目中我们一般使用第三方组件库进行开发&#xff0c;如 Element-Plus, 但是这些组件库提供的组件并不一定满足我们的需求&#xff0c;这时我们可以通过对组件库的组件进行二次封装&#xff0c;来满足我们特殊的需求。 对于封装组件有一个大原则就是我们应该尽量保…...

基于XGBoost算法的集成学习

目录 一、XGBoost原理1.1 提升方法&#xff08;Boosting&#xff09;1.2 提升决策树 &#xff08;BDT&#xff09;1.3 梯度提升决策树 &#xff08;GBDT&#xff09;1.4 极限梯度提升&#xff08;XGBoost&#xff09;1.4.1 XGBoost改进1.4.2 XGBoostcsklearn实现1.4.3 XGBoost回…...

数据库系列之分布式数据库下误删表怎么恢复?

数据的完整性是数据库可用性的基本功能&#xff0c;在实际应用数据库变更操作过程中可能因为误操作导致误删表或者truncate操作影响业务的正常访问。本文介绍了分布式数据库中在误删表场景下的数据恢复方案&#xff0c;并进行了对比。 1、数据库误删表恢复方案 应用数据的完整…...

Beamer-LaTeX学习(教程批注版)【1】

该文档总体由beamer-latex的教程而来&#xff0c;由耳东小白以自身学习路径整理。因其中要点基本按照教程的顺序和结构整理&#xff0c;故而不能称之为完全原创&#xff0c;但也不是翻译&#xff0c;更不是抄袭&#xff0c;是个人自学笔记和批注&#xff0c;其中添加了小白个人…...

数据挖掘——关联规则挖掘

数据挖掘——关联数据挖掘 关联数据挖掘关联规则关联规则挖掘问题&#xff1a;具体挖掘过程Apriori 产生关联规则 关联数据挖掘 关联分析用于发现隐藏在大型数据集中的令人感兴趣的联系&#xff0c;所发现的模式通常用关联规则或频繁项集的形式表示。 关联规则反映一个事物与…...

六种主流服务器的选择与使用

网络的运行离不开各种服务器&#xff0c;它们各司其职&#xff0c;为我们提供稳定的网络服务。本文带大家了解6种常见服务器类型。 服务器的六大种类 第一种&#xff1a;Web服务器 Web服务器是互联网的核心。当你打开一个网站&#xff0c;比如百度或淘宝&#xff0c;浏览器会…...

springboot3 redis 常用操作工具类

在 Spring Boot 3 中&#xff0c;操作 Redis 通常使用 Spring Data Redis 提供的工具类&#xff0c;如 RedisTemplate 和 StringRedisTemplate。以下是一个详细的 Redis 操作工具类的实现&#xff0c;涵盖了常用功能。 完整的 Redis 工具类 以下工具类可以实现基本的 Redis 操…...

OJ随机链表的复制题目分析

题目内容&#xff1a; 138. 随机链表的复制 - 力扣&#xff08;LeetCode&#xff09; 分析&#xff1a; 这道题目&#xff0c;第一眼感觉非常乱&#xff0c;这是正常的&#xff0c;但是我们经过仔细分析示例明白后&#xff0c;其实也并不是那么难。现在让我们一起来分析分析…...

如何不修改模型参数来强化大语言模型 (LLM) 能力?

前言 如果你对这篇文章感兴趣&#xff0c;可以点击「【访客必读 - 指引页】一文囊括主页内所有高质量博客」&#xff0c;查看完整博客分类与对应链接。 大语言模型 (Large Language Model, LLM, e.g. ChatGPT) 的参数量少则几十亿&#xff0c;多则上千亿&#xff0c;对其的训…...

Win11+WLS Ubuntu 鸿蒙开发环境搭建(二)

参考文章 penHarmony南向开发笔记&#xff08;一&#xff09;开发环境搭建 OpenHarmony&#xff08;鸿蒙南向开发&#xff09;——标准系统移植指南&#xff08;一&#xff09; OpenHarmony&#xff08;鸿蒙南向开发&#xff09;——小型系统芯片移植指南&#xff08;二&…...

Qemu配置QXL显卡支持分辨率

默认情况下&#xff0c;创建的vm的视频RAM限制为16MB。在win操作系统中分辨率最高就只能调到1024x768。 <video><model typecirrus vram16384 heads1 primaryyes/><address typepci domain0x0000 bus0x00 slot0x02 function0x0/> </video>单单修改ram…...

Hack The Box-Starting Point系列Three

答案 How many TCP ports are open?&#xff08;靶机开了几个TCP端口&#xff09; 2What is the domain of the email address provided in the “Contact” section of the website?&#xff08;网站的“CONTACT”部分提供的电子邮件地址的域是什么&#xff1f;&#xff09…...

人工智能-Python多任务编程-进程、线程

多任务的实现方式 多进程 多线程 1 多任务的两种表现形式 并发: 在一段时间内交替去执行多个任务&#xff08;任务数大于CPU核心数&#xff09;并行: 在一段时间内真正的同时一起执行多个任务&#xff08;任务数小于等于CPU核心数&#xff09; 2 进程 进程&#xff08;Proc…...

智能工厂的设计软件 应用场景的一个例子:为AI聊天工具添加一个知识系统 之9 重新开始 之2

本文要点 对程序设计而言&#xff1a;前者基于一个自上而下的 分类体系--&#xff08;生物遗传基因&#xff09;&#xff0c;后者者需要一个收集差异的自下而上的差异继承路径--&#xff08;系统继承源流&#xff09; 就是 广义和狭义 分类学。 共性对齐 和 差异收集 正是两者…...

Postman[7] 内置动态参数及自定义的动态参数

postman 内置动态参数和自定义的动态参数 1.内置动态参数 格式&#xff1a;{{$参数名}} 1.1时间戳 {{$timestamp}} //生成当前时间的时间戳 1.2随机整数 {{$randomint}} //生成0-1000之间的随机数 1.3GUID字符串 {{$guid}} //生成随机GUID字符串 2.自定义动态参数 格式…...

04-c++类和对象(下)

一、友元 前面学习的类中&#xff0c;只能通过该类的公共方法访问私有数据。而如果将某个函数设置为类的友元&#xff0c;那么这个函数就可以直接访问该类的私有数据&#xff0c;破坏了类的封装性&#xff0c;只在某些特定的情况下使用。 友元的分类&#xff1a;普通全局函数…...

《解密奖励函数:引导智能体走向最优策略》

在强化学习领域&#xff0c;奖励函数是核心要素&#xff0c;它决定了智能体如何学习和决策。设计一个恰当的奖励函数&#xff0c;能让智能体在复杂环境中不断探索、优化&#xff0c;最终实现最优策略。 奖励函数的重要性 奖励函数就像是一个引导者&#xff0c;它告诉智能体什…...

AF3 AtomAttentionEncoder类的init_pair_repr方法解读

AlphaFold3 的 AtomAttentionEncoder 类中,init_pair_repr 方法方法负责为原子之间的关系计算成对表示(pair representation),这是原子转变器(atom transformer)模型的关键组成部分,直接影响对蛋白质/分子相互作用的建模。 init_pair_repr源代码: def init_pair_repr(…...

VScode 格式化代码空格记录

点击 -> “文件” -> “首选项" -> “设置” -> 按下图操作&#xff1a; 怎么格式化代码空格&#xff0c;先看下&#xff1a; 保存代码后&#xff0c;这代码自动格式化发&#xff0c;如下图&#xff1a; 你可以试试看就即可...

28.Marshal.PtrToStringAnsi C#例子

//怎么说呢&#xff0c;这个代码Marshal的英文意思有将军&#xff0c;控制等等&#xff0c; //我的理解是类似于console控制台。 //然后后面这个Ansi是一种ASCII的扩展&#xff0c;还有其他编码方式可选 就是一个把后面的指针转化为字符串的一个代码 这是用法…...

Git的使用流程(详细教程)

目录 01.Git是什么&#xff1f; 1.1 Git简介 1.2 SVN与Git的最主要的区别 1.3 GIt主要特点 02.Git是干什么的&#xff1f; 2.1.Git概念汇总 2.2 工作区/暂存区/仓库 2.3 Git使用流程 03.Git的安装配置 3.1 Git的配置文件 3.2 配置-初始化用户 3.3 Git可视化…...

第R3周:RNN-心脏病预测

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 文章目录 一、前言二、代码流程1、导入包&#xff0c;设置GPU2、导入数据3、数据处理4、构建RNN模型5、编译模型6、模型训练7、模型评估 电脑环境&#xff1a;…...

clickhouse Cannot execute replicated DDL query, maximum retries exceeded报错解决

报错信息 在clickhouse中执行DDL命令对表进行改动时&#xff0c;出现报错Cannot execute replicated DDL query, maximum retries exceeded 解决方案 一、官方解决方案 官方说这是一个特定版本的bug&#xff0c;但是实际我自己用的22.9.34版本&#xff0c;也存在这个问题&a…...

【时时三省】(C语言基础)常见的动态内存错误

山不在高&#xff0c;有仙则名。水不在深&#xff0c;有龙则灵。 ----CSDN 时时三省 对NULL指针的解引用操作 示例&#xff1a; malloc申请空间的时候它可能会失败 比如我申请一块非常大的空间 那么空间可能就会开辟失败 正常的话要写一个if&#xff08;p&#xff1d;&#x…...

【JVM】总结篇-字节码篇

字节码篇 Java虚拟机的生命周期 JVM的组成 Java虚拟机的体系结构 什么是Java虚拟机 虚拟机&#xff1a;指以软件的方式模拟具有完整硬件系统功能、运行在一个完全隔离环境中的完整计算机系统 &#xff0c;是物理机的软件实现。常用的虚拟机有VMWare&#xff0c;Visual Box&…...

二十三种设计模式-抽象工厂模式

抽象工厂模式&#xff08;Abstract Factory Pattern&#xff09;是一种创建型设计模式&#xff0c;它提供了一种方式&#xff0c;用于创建一系列相关或相互依赖的对象&#xff0c;而不需要指定它们具体的类。这种模式主要用于系统需要独立于其产品的创建逻辑时&#xff0c;并且…...

【docker】Dockerfile 中使用宿主机代理的方式

在Dockerfile中配置代理主要有这几种方式&#xff0c;让我系统地整理一下&#xff1a; 构建参数方式&#xff08;BUILD ARG&#xff09; # 方式1&#xff1a;在Dockerfile顶部定义 ARG HTTP_PROXYhttp://proxy:7890 ARG HTTPS_PROXYhttp://proxy:7890# 方式2&#xff1a;在构…...

现代无线通信接收机架构:超外差、零中频与低中频的比较分析

写在前面&#xff1a;本博客是对三种接收机架构的学习笔记&#xff0c;仅供个人学习记录使用。内容主要是上网查阅的资料&#xff0c;以及个人的一些理解。如有错误的地方请指出&#xff01; 文章目录 一、通信机基本架构 1、射频发射级的基本组成及完成功能2、射频接收级的基…...

CSS 图片廊:网页设计的艺术与技巧

CSS 图片廊&#xff1a;网页设计的艺术与技巧 引言 在网页设计中&#xff0c;图片廊是一个重要的组成部分&#xff0c;它能够以视觉吸引的方式展示图片集合&#xff0c;增强用户的浏览体验。CSS&#xff08;层叠样式表&#xff09;作为网页设计的主要语言之一&#xff0c;提供…...

Gemini和ChatGPT全面对比分析,有什么区别和优势?

当 AI 聊天机器人首次出现时&#xff0c;每个人都在竞相发布自己的足够好的第一版 AI 聊天机器人&#xff0c;很容易在 Gemini 与 ChatGPT 等应用程序之间进行比较。但随着 Google 和 OpenAI 不断添加新功能、模型和访问其聊天机器人的方式&#xff0c;差异变得不那么明显。 现…...

Ansys Discovery 中的网格划分方法:探索模式

本篇博客文章将介绍 Ansys Discovery 中可用于在探索模式下进行分析的网格划分方法。我们将在下一篇博客中介绍 Refine 模式下的网格划分技术。 了解 Discovery Explore 模式下的网格划分 网格划分是将几何模型划分为小单元以模拟系统在不同条件下的行为的过程。这是通过创建…...

前 5 名 IPhone 解锁工具/软件

设备已禁用并且您无法访问它&#xff1f;如果您无法通过密码解锁&#xff0c;尝试 iPhone 解锁软件可能是最好的解决方案。 虽然市场上有很多免费或付费的 iPhone 解锁工具&#xff0c;但您可能不知道它们之间的区别以及如何选择最适合您的工具。 本文将介绍 5 款iPhone 解锁…...

富士通 自动进纸 扫描仪 scan 按钮 触发设置

附赠光盘里的驱动和软件都先装好&#xff0c;然后3步&#xff0c; 1&#xff0c;控制面板&#xff0c;对着设备右键&#xff0c;详细设置&#xff0c;触发对应&#xff0c;选择stream capture软件。&#xff08;差不多就这意思&#xff0c;懂的自然懂&#xff09; 2&#xff…...

SpringCloud系列教程:微服务的未来 (五)枚举处理器、JSON处理器、分页插件实现

在现代 Java 开发中&#xff0c;我们常常需要处理各种通用的功能和需求&#xff0c;诸如枚举的处理、JSON 数据处理&#xff0c;以及分页查询等。这些功能虽然看似简单&#xff0c;但在实际开发中往往涉及到许多细节和优化。为了提高开发效率、减少重复代码的编写&#xff0c;我…...

dos2unix: command not found

如果你在终端或命令行界面中遇到了“dos2unix: command not found”的错误&#xff0c;这意味着你的系统中没有安装dos2unix工具。dos2unix是一个用于将文本文件中的DOS/Mac格式的行结束符转换为Unix/Linux格式的行结束符的工具。 以下是一些解决方法&#xff1a; 安装dos2un…...

使用 Docker 查看 Elasticsearch 错误日志

在使用 Elasticsearch&#xff08;简称 ES&#xff09;的过程中&#xff0c;我们可能会遇到各种问题。为了快速定位和解决这些问题&#xff0c;查看错误日志是关键。本文将介绍如何使用 Docker 查看 Elasticsearch 的错误日志&#xff0c;并提供一些实用技巧。 1. 安装 Docker…...

Scala 访问修饰符

Scala 访问修饰符 在编程语言中&#xff0c;访问修饰符是一种重要的语法元素&#xff0c;它用于控制类、对象、特质、接口、方法和变量的访问级别。Scala作为一种多范式编程语言&#xff0c;也提供了丰富的访问修饰符&#xff0c;以实现封装和隐藏内部实现细节。本文将详细介绍…...

VisualRules规则引擎语法介绍

VisualRules规则引擎是一款用于处理复杂业务规则的引擎&#xff0c;广泛应用于金融、保险、医疗等领域。它通过将业务逻辑从代码中分离出来&#xff0c;以可配置的方式管理和执行规则。以下是VisualRules规则引擎的基本语法和使用方法&#xff1a; 1. 规则定义 规则通常由 条件…...

UDP_TCP

目录 1. 回顾端口号2. UDP协议2.1 理解报头2.2 UDP的特点2.3 UDP的缓冲区及注意事项 3. TCP协议3.1 报头3.2 流量控制2.3 数据发送模式3.4 捎带应答3.5 URG && 紧急指针3.6 PSH3.7 RES 1. 回顾端口号 在 TCP/IP 协议中&#xff0c;用 “源IP”&#xff0c; “源端口号”…...

web端显示spine动画

一、说明 &#xff08;1&#xff09;这边使用的spine版本是3.8.99 spine包含3个部分,可以将三个文件上传到cdn&#xff0c;三个文件放在相同的目录中 test.atlas 、 test.json 、test.png &#xff08;2&#xff09;pixi.js - v7.0.4 https://github.com/pixijs/pixijs &…...

【74HC192减法24/20/72进制】2022-5-17

缘由用74ls192设计一个72进制的减法计数器&#xff0c;需要有逻辑电路图-硬件开发-CSDN问答...

前端安全措施:接口签名、RSA加密、反调试、反反调试、CAPTCHA验证

文章目录 引言I 设置防爬虫功能使用robots.txt文件通过配置HTTP头部中的X-Robots-TagII 禁止打开开发者工具反复清空控制台无限debugger反调试检查是否按下了F12或其他调试快捷键禁用右键监听调试快捷键例子III 屏蔽粘贴/复制/剪切/选中IV 知识扩展: javascript内置命令调试分…...

算法攻略:顺序表的进阶之路——移除元素

题目如下&#xff1a; 思路&#xff1a; 双指针法 nums[src] val&#xff0c;srcnums[src] ! val&#xff0c;src的值赋值给dst&#xff0c;src和dst都 注&#xff1a; 1&#xff09;双指针法&#xff1a;只是抽象出了两个指向数组的变量&#xff0c;并不是真的指针。 2&#…...

zookeeper+kafka

一、zookeeper 1.概述 zoo: 开源的分布式框架协调服务 zookeeper的工作机制&#xff1a;基于观察者模式设计的分布式结构&#xff0c;负责存储和管理架构当中的元信息&#xff0c;架构当中的应用接受观察者的监控&#xff0c;一旦数据有变化&#xff0c;通知对应的zookeeper&a…...

大循环引起CPU负载过高

一、问题背景 环境&#xff1a;jdk1.8 tomcat7 在一次发布时&#xff0c;cpu出现负载过高&#xff0c;其负载突破200%&#xff0c;并且响应时间也大幅度超时。 二、问题分析 【1】发布前做过压测&#xff0c;并没有发现cpu异常升高的现象&#xff0c;所以其可能与生产环境的请…...