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

kotlin 01flow-StateFlow 完整教程

一 Android StateFlow 完整教程:从入门到实战

StateFlow 是 Kotlin 协程库中用于状态管理的响应式流,特别适合在 Android 应用开发中管理 UI 状态。本教程将带全面了解 StateFlow 的使用方法。

1. StateFlow 基础概念

1.1 什么是 StateFlow?

StateFlow 是 Kotlin 协程提供的一种热流(Hot Flow),它具有以下特点:

  • 总是有当前值(初始值必须提供)
  • 只保留最新值
  • 支持多个观察者
  • 与 LiveData 类似但基于协程

1.2 StateFlow vs LiveData

特性StateFlowLiveData
生命周期感知否(需配合 lifecycleScope)
需要初始值
基于协程观察者模式
线程控制通过 Dispatcher主线程
背压处理自动处理自动处理

2. 基本使用

2.1 添加依赖

在 build.gradle 中添加:

dependencies {implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4"implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4"implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1"implementation "androidx.lifecycle:lifecycle-runtime-ktx:2.5.1"
}

2.2 创建 StateFlow

class MyViewModel : ViewModel() {// 私有可变的StateFlowprivate val _uiState = MutableStateFlow<UiState>(UiState.Loading)// 公开不可变的StateFlowval uiState: StateFlow<UiState> = _uiState.asStateFlow()sealed class UiState {object Loading : UiState()data class Success(val data: String) : UiState()data class Error(val message: String) : UiState()}fun loadData() {viewModelScope.launch {_uiState.value = UiState.Loadingtry {val result = repository.fetchData()_uiState.value = UiState.Success(result)} catch (e: Exception) {_uiState.value = UiState.Error(e.message ?: "Unknown error")}}}
}

2.3 在 Activity/Fragment 中收集 StateFlow

class MyActivity : AppCompatActivity() {private val viewModel: MyViewModel by viewModels()override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)lifecycleScope.launch {repeatOnLifecycle(Lifecycle.State.STARTED) {viewModel.uiState.collect { state ->when (state) {is MyViewModel.UiState.Loading -> showLoading()is MyViewModel.UiState.Success -> showData(state.data)is MyViewModel.UiState.Error -> showError(state.message)}}}}}private fun showLoading() { /*...*/ }private fun showData(data: String) { /*...*/ }private fun showError(message: String) { /*...*/ }
}

3. 高级用法

3.1 结合 SharedFlow 处理一次性事件

class EventViewModel : ViewModel() {private val _events = MutableSharedFlow<Event>()val events = _events.asSharedFlow()sealed class Event {data class ShowToast(val message: String) : Event()object NavigateToNextScreen : Event()}fun triggerEvent() {viewModelScope.launch {_events.emit(Event.ShowToast("Hello World!"))}}
}// 在Activity中收集
lifecycleScope.launch {repeatOnLifecycle(Lifecycle.State.STARTED) {viewModel.events.collect { event ->when (event) {is EventViewModel.Event.ShowToast -> showToast(event.message)EventViewModel.Event.NavigateToNextScreen -> navigateToNext()}}}
}

3.2 状态合并 (combine)

val userName = MutableStateFlow("")
val userAge = MutableStateFlow(0)val userInfo = combine(userName, userAge) { name, age ->"Name: $name, Age: $age"
}// 收集合并后的流
userInfo.collect { info ->println(info)
}

3.3 状态转换 (map, filter, etc.)

val numbers = MutableStateFlow(0)val evenNumbers = numbers.filter { it % 2 == 0 }.map { "Even: $it" }evenNumbers.collect { println(it) }

4. 性能优化

4.1 使用 stateIn 缓存 StateFlow

val networkFlow = flow {// 模拟网络请求emit(repository.fetchData())
}val cachedState = networkFlow.stateIn(scope = viewModelScope,started = SharingStarted.WhileSubscribed(5000), // 5秒无订阅者停止initialValue = "Loading..."
)

4.2 避免重复收集

// 错误方式 - 每次重组都会创建新的收集器
@Composable
fun MyComposable(viewModel: MyViewModel) {val state by viewModel.state.collectAsState()// ...
}// 正确方式 - 使用 derivedStateOf 或 remember
@Composable
fun MyComposable(viewModel: MyViewModel) {val state by remember { viewModel.state }.collectAsState()// ...
}

5. 测试 StateFlow

5.1 单元测试

@Test
fun `test state flow`() = runTest {val viewModel = MyViewModel()val results = mutableListOf<MyViewModel.UiState>()val job = launch {viewModel.uiState.collect { results.add(it) }}viewModel.loadData()advanceUntilIdle()assertEquals(3, results.size) // Loading, Success/ErrorassertTrue(results[0] is MyViewModel.UiState.Loading)job.cancel()
}

5.2 使用 Turbine 测试库

dependencies {testImplementation "app.cash.turbine:turbine:0.12.1"
}@Test
fun `test with turbine`() = runTest {val viewModel = MyViewModel()viewModel.uiState.test {viewModel.loadData()assertEquals(MyViewModel.UiState.Loading, awaitItem())val success = awaitItem()assertTrue(success is MyViewModel.UiState.Success)cancelAndIgnoreRemainingEvents()}
}

6. 常见问题解答

Q1: StateFlow 和 LiveData 哪个更好?

StateFlow 更适合协程环境,LiveData 更简单但功能较少。新项目推荐 StateFlow。

Q2: 如何处理背压(Backpressure)?

StateFlow 自动处理背压,只保留最新值。

Q3: 为什么我的收集器没有收到更新?

检查:

  1. 是否在正确的生命周期范围内收集
  2. Flow 是否有发射新值
  3. 是否在正确的协程上下文中

Q4: 如何避免内存泄漏?

使用 repeatOnLifecycleflowWithLifecycle 确保只在活跃生命周期收集。

7. 完整示例项目

以下是一个完整的 ViewModel 示例:

class UserViewModel(private val userRepository: UserRepository) : ViewModel() {private val _userState = MutableStateFlow<UserState>(UserState.Loading)val userState: StateFlow<UserState> = _userState.asStateFlow()private val _events = MutableSharedFlow<UserEvent>()val events: SharedFlow<UserEvent> = _events.asSharedFlow()init {loadUser()}fun loadUser() {viewModelScope.launch {_userState.value = UserState.Loadingtry {val user = userRepository.getUser()_userState.value = UserState.Success(user)} catch (e: Exception) {_userState.value = UserState.Error(e.message ?: "Unknown error")_events.emit(UserEvent.ShowErrorToast("Failed to load user"))}}}fun updateUserName(name: String) {viewModelScope.launch {val currentUser = (_userState.value as? UserState.Success)?.user ?: return@launchval updatedUser = currentUser.copy(name = name)_userState.value = UserState.Success(updatedUser)userRepository.updateUser(updatedUser)}}sealed class UserState {object Loading : UserState()data class Success(val user: User) : UserState()data class Error(val message: String) : UserState()}sealed class UserEvent {data class ShowErrorToast(val message: String) : UserEvent()}
}

通过本教程,应该已经掌握了 StateFlow 的核心用法。StateFlow 是构建响应式 Android 应用的强大工具,结合协程可以提供更简洁、更安全的状态管理方案。

二 stateFlow和sharedFlow的区别

关于 StateFlowSharedFlow 的问题非常关键。它们都是 Kotlin Flow 的“热流”(hot stream)变种,广泛用于 事件驱动编程状态管理。下面逐条详细解答问题:


✅ 1. StateFlow 和 SharedFlow 的区别?能否互相转换?

特性StateFlowSharedFlow
是否需要初始值✅ 是(必须有)❌ 否(可选)
是否有当前值 .value✅ 是❌ 没有
是否支持粘性订阅(可立即获取最新值)✅ 是(始终有当前值)❌ 否(默认非粘性,取决于 replay)
用于什么状态管理(UI 状态)一次性事件(导航、吐司等)
是否自动重发✅ 是:新订阅者立即拿到当前值❌ 否(需设置 replay > 0 才能重发)
是否支持多次发送相同值❌ 否(相同值不会触发 collect)✅ 是
是否丢失事件❌ 不会丢(始终保留一个最新值)✅ 可能丢(如果没有设置 replay 或 buffer)

🔁 能否互相转换?

不能直接转换,因为它们底层设计不同。但可以人为地模拟:

val sharedFlow = MutableSharedFlow<Int>(replay = 1)
val stateFlow = sharedFlow.stateIn(scope, SharingStarted.Eagerly, initialValue)

或者从 StateFlow 获取 SharedFlow 的行为:

val stateFlow: StateFlow<Int> = MutableStateFlow(0)
val sharedFlow = stateFlow.shareIn(scope, SharingStarted.Lazily)

✅ 2. 是不是 StateFlow 就是 SharedFlow 多了 .value 和初始值?

可以这么说,但这只是表面。它们的语义不同:

  • StateFlow 表示的是状态的容器(如 ViewModel 中的 UI 状态)。
  • SharedFlow 更像是事件的通道,没有“当前状态”的概念。
// StateFlow 的特点
println(stateFlow.value) // 始终可以拿到当前值// SharedFlow 没有 value,只能 collect
sharedFlow.collect { event -> ... }

✅ 3. 如何处理“被压的”问题(Backpressure、丢失事件)?

📌 StateFlow

  • 没有丢失问题:永远保留最后一个值。
  • 新订阅者会立刻收到当前值。
  • 不支持 backpressure,因为没有队列:只有一个值。
val sf = MutableStateFlow(0)
sf.value = 1
sf.value = 2
// collect 会立即收到 2(中间的1不会被保留)

📌 SharedFlow

  • 默认不保留任何事件replay = 0,无 buffer)。
  • 如果事件很快发送但没人 collect,就直接丢失
  • 可以设置 replayextraBufferCapacity 来控制:
val shared = MutableSharedFlow<Int>(replay = 2,extraBufferCapacity = 5
)
  • 设置 onBufferOverflow = BufferOverflow.DROP_OLDEST/ DROP_LATEST / SUSPEND 控制丢弃策略。

✅ 使用建议总结

需求推荐使用
需要保存并暴露当前状态(如 UI 状态)StateFlow
需要发送一次性事件,如 Toast、导航SharedFlow
想在订阅时立即拿到最后值StateFlow
想发送多个相同值SharedFlow(StateFlow 会去重)

相关文章:

kotlin 01flow-StateFlow 完整教程

一 Android StateFlow 完整教程&#xff1a;从入门到实战 StateFlow 是 Kotlin 协程库中用于状态管理的响应式流&#xff0c;特别适合在 Android 应用开发中管理 UI 状态。本教程将带全面了解 StateFlow 的使用方法。 1. StateFlow 基础概念 1.1 什么是 StateFlow? StateF…...

OpenGl实战笔记(1)基于qt5.15.2+mingw64+opengl绘制三角形

一、实现效果 二、实现原理 &#xff08;1&#xff09;各函数作用与原理 initialize() 作用&#xff1a; 初始化 OpenGL 函数&#xff08;initializeOpenGLFunctions()&#xff09; 设置背景清除颜色为 rgba(0.2, 0.3, 0.4, 1.0)。 原理&#xff1a; initializeOpenGLFunctio…...

S100平台调试RS485/RS232

提供一个C语言的测试程序Demo #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h>...

蓝桥杯 19. 植树

植树 题目描述 小明和朋友们一起去郊外植树&#xff0c;他们带了一些在实验室中精心研究出的小树苗。 一共有 n 个人&#xff0c;每个人挑选了一个适合植树的位置&#xff0c;一共 n 个位置。每人准备在自己的位置种下一棵树苗。 但他们遇到一个问题&#xff1a;有的树苗比…...

Spring Boot 中 @Bean 注解详解:从入门到实践

在 Spring Boot 开发中&#xff0c;Bean注解是一个非常重要且常用的注解&#xff0c;它能够帮助开发者轻松地将 Java 对象纳入 Spring 容器的管理之下&#xff0c;实现对象的依赖注入和生命周期管理。对于新手来说&#xff0c;理解并掌握Bean注解&#xff0c;是深入学习 Spring…...

git项目迁移,包括所有的提交记录和分支 gitlab迁移到gitblit

之前git都是全新项目上传&#xff0c;没有迁移过&#xff0c;因为迁移的话要考虑已有项目上的分支都要迁移过去&#xff0c;提交记录能迁移就好&#xff1b;分支如果按照全新项目上传的方式需要新git手动创建好老git已有分支&#xff0c;在手动一个一个克隆老项目分支代码依次提…...

前端面试每日三题 - Day 25

这是我为准备前端/全栈开发工程师面试整理的第25天每日三题练习&#xff0c;涵盖了&#xff1a; CSS中如何实现一个保持宽高比的自适应正方形元素Angular的变更检测&#xff08;Change Detection&#xff09;机制项目实战 - 设计一个微前端架构的前端应用。 ✅ 题目1&#xff…...

基于windows安装MySQL8.0.40

基于windows安装MySQL8.0.40 基于windows 安装 MySQL8.0.40&#xff0c;解压文件到D:\mysql-8.0.40-winx64 在D:\mysql-8.0.40-winx64目录下创建my.ini文件&#xff0c;并更新一下内容 [client] #客户端设置&#xff0c;即客户端默认的连接参数 # 设置mysql客户端连接服务…...

基于机器学习算法预测二手车市场数据清洗与分析平台(源码+定制+讲解) 基于Python的数据挖掘与可视化 二手车数据处理与分析系统开发 (机器学习算法预测)

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…...

【神经网络与深度学习】普通自编码器和变分自编码器的区别

引言 自编码器&#xff08;Autoencoder&#xff0c;AE&#xff09;和变分自编码器&#xff08;Variational Autoencoder&#xff0c;VAE&#xff09;是深度学习中广泛应用的两类神经网络结构&#xff0c;主要用于数据的压缩、重构和生成。然而&#xff0c;二者在模型设计、训练…...

【现代深度学习技术】现代循环神经网络07:序列到序列学习(seq2seq)

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈PyTorch深度学习 ⌋ ⌋ ⌋ 深度学习 (DL, Deep Learning) 特指基于深层神经网络模型和方法的机器学习。它是在统计机器学习、人工神经网络等算法模型基础上&#xff0c;结合当代大数据和大算力的发展而发展出来的。深度学习最重…...

【Linux我做主】进度条小程序深度解析

Linux下C语言进度条程序深度解析 进度条小程序GitHub地址 前言前置知识回车换行&#xff08;CR/LF&#xff09;的深度解析历史渊源与技术规范在进度条/倒计时中的应用 缓冲区机制的全面剖析缓冲区引入缓冲类型对比进度条开发中的关键控制 进度条实现以小见大——倒计时倒计时最…...

Vue项目安全实践指南:从输入验证到状态管理的全方位防护

一、项目背景 在Vue2项目开发过程中&#xff0c;我们遇到了一些需要优化的安全实践问题。本文将分享我们在项目中的一些安全优化经验&#xff0c;希望能帮助到其他开发者。 主要优化点&#xff1a; 输入输出安全处理请求安全防护数据存储安全路由访问控制文件上传处理表单数…...

Pinocchio导入URDF关节为continuous的问题及详细解释

视频讲解&#xff1a; Pinocchio导入URDF关节为continuous的问题及详细解释 仓库地址&#xff1a;GitHub - LitchiCheng/mujoco-learning 问题背景&#xff1a;打算测试将之前的panda的urdf换成so-arm100的urdf&#xff0c;发现pinocchio的代码不能用&#xff0c;很奇怪&#…...

《Python星球日记》第30天:Flask数据库集成

名人说&#xff1a;路漫漫其修远兮&#xff0c;吾将上下而求索。—— 屈原《离骚》 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 专栏&#xff1a;《Python星球日记》&#xff0c;限时特价订阅中ing 目录 一、数据库…...

GAF-CNN-SSA-LSSVM故障诊断/分类预测,附带模型研究报告(Matlab)

GAF-CNN-SSA-LSSVM故障诊断/分类预测&#xff0c;附带模型研究报告&#xff08;Matlab&#xff09; 目录 GAF-CNN-SSA-LSSVM故障诊断/分类预测&#xff0c;附带模型研究报告&#xff08;Matlab&#xff09;效果一览基本描述程序设计参考资料 效果一览 基本描述 本研究提出的GA…...

轻松养生:让健康融入生活

养生不是负担&#xff0c;而是可以轻松融入日常的生活方式。掌握以下要点&#xff0c;就能开启健康之旅。 清晨醒来&#xff0c;先喝一杯常温水&#xff0c;唤醒沉睡的肠胃。早餐选择富含膳食纤维的燕麦片搭配新鲜水果&#xff0c;补充能量又促进消化。午餐和晚餐做到荤素搭配&…...

工业主义与民主的兴衰:历史逻辑与未来危机

一、工业主义催生大众民主的机制 经济基础变革 非技术工人崛起&#xff1a;工业革命后&#xff0c;机器生产替代传统手工业&#xff0c;非熟练工人&#xff08;包括妇女、儿童&#xff09;收入提升&#xff0c;财富分配趋于平等&#xff0c;形成新兴中产阶级。 政府财政能力增…...

从代码学习深度学习 - 目标检测前置知识(二) PyTorch版

文章目录 前言一、多尺度目标检测1.1 多尺度锚框1.2 绘图工具函数 (`utils_for_huitu.py`)1.3 可视化多尺度锚框1.4 多尺度检测(理论)二、自定义目标检测数据集2.1 读取数据2.2 创建 Dataset 类2.3 创建 DataLoader2.4 验证数据加载2.5 可视化数据集样本总结前言 大家好!欢…...

什么是“系统调用”

一、什么是“系统调用”&#xff1f;用生活中的比喻理解 可以把“系统调用”比作你&#xff08;用户&#xff09;向“管理员”请求帮助完成某件事情的过程。 举个例子&#xff1a; 你想借书&#xff0c;去图书馆&#xff08;操作系统&#xff09;找管理员&#xff08;内核&a…...

代码异味(Code Smell)识别与重构指南

1、引言:什么是“代码异味”? 在软件开发中,“代码异味(Code Smell)”是指那些虽然不会导致程序编译失败或运行错误,但暗示着潜在设计缺陷或可维护性问题的代码结构。它们是代码演进过程中的“信号灯”,提示我们某段代码可能需要优化。 1.1 ✅ 为什么关注代码异味? 预…...

005-nlohmann/json 基础方法-C++开源库108杰

《二、基础方法》&#xff1a;节点访问、值获取、显式 vs 隐式、异常处理、迭代器、类型检测、异常处理……一节课搞定C处理JSON数据85%的需求…… JSON 字段的简单类型包括&#xff1a;number、boolean、string 和 null&#xff08;即空值&#xff09;&#xff1b;复杂类型则有…...

java学习之数据结构:四、树(代码补充)

这部分主要是用代码实现有序二叉树、树遍历、删除节点 目录 1.构建有序二叉树 1.1原理 1.2插入实现 2.广度优先遍历--队列实现 3.深度优先遍历--递归实现 3.1先序遍历 3.2中序遍历 3.3后序遍历 4.删除 4.1删除叶子节点 4.2删除有一棵子树的节点 4.3删除有两棵子树的节…...

Java面试场景分析:从音视频到安全与风控的技术探讨

Java面试场景分析&#xff1a;从音视频到安全与风控的技术探讨 在一个阳光明媚的早晨&#xff0c;互联网大厂的面试室里&#xff0c;面试官李老师坐在桌前&#xff0c;严肃认真&#xff1b;而程序员小张则显得有些紧张&#xff0c;甚至有些搞笑。 第一轮提问&#xff1a; 李老…...

《OmniMeetProTrack 全维会议链智能追录系统 软件设计文档》

撰稿人&#xff1a;wjz 一、引言 1.1 目的 本软件设计文档详细描述了 OmniMeetProTrack 全维会议链智能追录系统的架构、组件、模块设计及实现细节&#xff0c;旨在为开发人员、利益相关者和维护人员提供系统的全面设计蓝图。本文档基于需求定义文档&#xff0c;确保系统实现…...

C 语言逻辑运算符:组合判断,构建更复杂的条件

各类资料学习下载合集 ​​https://pan.quark.cn/s/8c91ccb5a474​​ 在 C 语言编程中,我们已经学习了如何使用比较运算符(如 ​​==​​​, ​​<​​​, ​​>​​)来判断两个值之间的关系,从而得到“真”或“假”的结果。但很多时候,我们需要根据多个条件的组合…...

大模型推理框架简介

概述 通常需要大量的计算资源&#xff0c;高效运行LLMs仍然是一个挑战&#xff0c; 推理框架作为LLM高效部署的关键组件&#xff0c;直接关系到应用的性能、成本和开发效率。 高性能框架 vLLM GitHub&#xff0c;由SKYPILOT构建的推理优化框架&#xff0c;旨在提高在GPU上…...

《MATLAB实战训练营:从入门到工业级应用》高阶挑战篇-《5G通信速成:MATLAB毫米波信道建模仿真指南》

《MATLAB实战训练营&#xff1a;从入门到工业级应用》高阶挑战篇-5G通信速成&#xff1a;MATLAB毫米波信道建模仿真指南 &#x1f680;&#x1f4e1; 大家好&#xff01;今天我将带大家进入5G通信的奇妙世界&#xff0c;我们一起探索5G通信中最激动人心的部分之一——毫米波信…...

word导出pdf带有目录导航栏-error记

1、打开word文档——>点击"视图"选项卡——>勾选"导航窗格" 2、点击"文件"——>导出——>创建PDF/XPS 3、点击"选项"——>勾选"创建书签时使用(C)" "标题(H)" 4、点击"确定"——>点击…...

word怎么删除空白页?word最后一页删不掉怎么办

在使用word的过程中&#xff0c;有时出现空白页就可能会给大家带来一些困扰。到底怎么样才能把这些空白页删除&#xff0c;又应该如何解决最后也删不掉的问题呢&#xff1f; 要想删除普通的空白页&#xff0c;那就需要将光标直接放在空白页&#xff0c;然后按【Delete】键&…...

虚幻基础:硬件输入

文章目录 triggered&#xff1a;按下一直触发 等于tickcompleted&#xff1a;必须等到triggered结束后 才触发松下triggered结束 默认按键触发顺序按下&#xff1a;触发两个先 Started后 Triggered 松开Completed 触发器&#xff1a;用于修改triggered 触发和结束驱动阈值&…...

【Java ee初阶】多线程(5)

一、wait 和 notify wait notify 是两个用来协调线程执行顺序的关键字&#xff0c;用来避免“线程饿死”的情况。 wait 和 notify 其实都是 Object 这个类的方法&#xff0c;而 Object这个类是所有类的“祖宗类”&#xff0c;也就是说明&#xff0c;任何一个类&#xff0c;都…...

售前赢单评分是越权吗?

相关文章 软件实施工作个人看法 当前部门软件产品经理的职责涵盖售前支持工作。此前梳理工作时&#xff0c;计划在每个售前支持项目完成后&#xff0c;由支持人对项目赢单概率进行评估&#xff0c;旨在通过这一机制筛选重点项目&#xff0c;为赢单率高的项目优先配置资源。 …...

uniapp中用canvas绘制简单柱形图,小容量,不用插件——简单使用canvas

uniapp中用canvas绘制简单柱形图&#xff0c;小容量&#xff0c;不用插件——简单使用canvas 完整代码 <template><view><!-- 学习数据 --><!-- 头部选项卡 --><view class"navTab"><view :class"listIndexi?activite:"…...

SecureCRT 使用指南:安装、设置与高效操作

目录 一、SecureCRT 简介 1.1 什么是 SecureCRT&#xff1f; 1.2 核心功能亮点 1.3 软件特点 二、SecureCRT 安装与激活 2.1 安装步骤&#xff08;Windows 系统&#xff09; 2.2 激活与破解&#xff08;仅供学习参考&#xff09; 三、基础配置与优化 3.1 界面与编码设…...

WebRTC 服务器之SRS服务器概述和环境搭建

1.概述 SRS&#xff08;Simple Realtime Server&#xff09;是一款高性能、跨平台的流媒体服务器&#xff0c;支持多种协议&#xff0c;包括 RTMP、WebRTC、HLS、HTTP-FLV、SRT、MPEG-DASH 和 GB28181。本文介绍了 SRS&#xff0c;包括其用途、关键功能、架构和支持协议。SRS 旨…...

第R8周:RNN实现阿尔兹海默病诊断(pytorch)

- **&#x1f368; 本文为[&#x1f517;365天深度学习训练营](https://mp.weixin.qq.com/s/rnFa-IeY93EpjVu0yzzjkw) 中的学习记录博客** - **&#x1f356; 原作者&#xff1a;[K同学啊](https://mtyjkh.blog.csdn.net/)** 一&#xff1a;前期准备工作 1.设置硬件设备 impo…...

vue+element 导航 实现例子

项目使用的是 vue 3&#xff0c;安装配置可以查看栏目前面的文章。 组件 导航&#xff1a;https://element-plus.org/zh-CN/component/menu.html 面包屑&#xff1a;https://element-plus.org/zh-CN/component/breadcrumb.html 安装element库 PS D:\code\my-vue3-project&g…...

金仓数据库 KingbaseES 在电商平台数据库迁移与运维中深入复现剖析

金仓数据库 KingbaseES 在电商平台数据库迁移与运维中深入复现剖析 前言 在当今数字化商业蓬勃发展的时代&#xff0c;电商平台的数据量呈爆发式增长&#xff0c;对数据库性能、稳定性和扩展性提出了极高要求。本文章基于大型电商平台原本采用 MySQL 数据库&#xff0c;但随着业…...

Go小技巧易错点100例(三十)

本期分享&#xff1a; 1.切片共享底层数组 2.获取Go函数的注释 切片共享底层数组 在Go语言中&#xff0c;切片和数组是两种不同的元素&#xff0c;但是切片的底层是数组&#xff0c;并且还有一个比较重要的机制&#xff1a;切片共享底层数组。 下面这段代码演示了切片&…...

LeetCode 热题 100 78. 子集

LeetCode 热题 100 | 78. 子集 大家好&#xff0c;今天我们来解决一道经典的算法题——子集。这道题在 LeetCode 上被标记为中等难度&#xff0c;要求给定一个整数数组 nums&#xff0c;返回该数组所有可能的子集&#xff08;幂集&#xff09;。解集不能包含重复的子集&#x…...

苹果公司正在与亚马逊支持的初创公司Anthropic展开合作

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…...

Python项目源码57:数据格式转换工具1.0(csv+json+excel+sqlite3)

1.智能路径处理&#xff1a;自动识别并修正文件扩展名&#xff0c;根据转换类型自动建议目标路径&#xff0c;实时路径格式验证&#xff0c;自动补全缺失的文件扩展名。 2.增强型预览功能&#xff1a;使用pandastable库实现表格预览&#xff0c;第三方模块自己安装一下&#x…...

Redis总结(六)redis持久化

本文将简单介绍redis持久化的两种方式 redis提供了两种不同级别的持久化方式&#xff1a; RDB持久化方式能够在指定的时间间隔能对你的数据进行快照存储.AOF持久化方式记录每次对服务器写的操作,当服务器重启的时候会重新执行这些命令来恢复原始的数据,AOF命令以redis协议追加保…...

【PostgreSQL数据分析实战:从数据清洗到可视化全流程】5.3 相关性分析(PEARSON/SPEARMAN相关系数)

&#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 文章大纲 5.3 相关性分析&#xff08;PEARSON/SPEARMAN相关系数&#xff09;5.3.1 相关性分析理论基础5.3.1.1 相关系数定义与分类5.3.1.2 Pearson相关系数&#xff08; Pearson Corr…...

C++负载均衡远程调用学习之负载均衡算法与实现

目录 01 lars 系统架构回顾 02 lars-lbAgentV0.4-route_lb处理report业务流程 03 lars-lbAgentV0.4-负责均衡判断参数配置 04 lars-lbAgentV0.4-负载均衡idle节点的失败率判断 05 lars-lbAgentV0.4-负载均衡overload节点的成功率判断 06 lars-lbAgentV0.4-负载均衡上报提交…...

AIGC学术时代:DeepSeek如何助力实验与数值模拟

目录 1.实验和数值模拟工具 2.结合使用 大家好这里是AIWritePaper官方账号&#xff0c;官网&#x1f449;AIWritePaper~ 在工程和科学研究的世界里&#xff0c;实验与数值模拟是探索未知、验证理论和推动创新的两大支柱。它们如同一对翅膀&#xff0c;让思想得以飞翔&#xf…...

PHP数组排序深度解析:sort()、rsort()、asort()、arsort()、ksort()、krsort() 的适用场景与性能对比

在PHP开发中&#xff0c;数组排序是日常操作的核心技能之一。无论是处理用户数据、产品列表&#xff0c;还是分析日志信息&#xff0c;合理的排序方法能显著提升代码的效率和可维护性。PHP提供了多种数组排序函数&#xff08;如 sort()、rsort()、asort() 等&#xff09;&#…...

2025年企业Radius认证服务器市场深度调研:中小企业身份安全投入产出比最优解

引言&#xff1a;数字化转型浪潮下的身份安全新命题 在混合办公成为常态、物联网设备呈指数级增长、网络攻击手段日益隐蔽的2025年&#xff0c;企业网络边界正在经历前所未有的重构。据IDC预测&#xff0c;全球企业网络安全投入中&#xff0c;身份与访问管理&#xff08;IAM&a…...

开源模型应用落地-qwen模型小试-Qwen3-8B-快速体验-批量推理(三)

一、前言 阿里云最新推出的 Qwen3-8B 大语言模型,作为国内首个集成“快思考”与“慢思考”能力的混合推理模型,凭借其 80 亿参数规模及 128K 超长上下文支持,正在重塑 AI 应用边界。该模型既可通过轻量化“快思考”实现低算力秒级响应,也能在复杂任务中激活深度推理模式,以…...