- 博客(447)
- 资源 (77)
- 收藏
- 关注
原创 kotlin Flow的技术范畴
Flow 是 Kotlin 协程库的一部分,用于处理异步数据流和响应式编程。它首次在 Kotlin 1.3 中作为实验性功能引入,并在 Kotlin 1.4 后稳定。Flow 属于 kotlinx.coroutines.flow.* 包,主要用于处理冷流(Cold Stream),而 StateFlow 和 SharedFlow 则用于热流(Hot Stream),适用于状态共享和事件广播。Flow 类似于 RxJava 中的 Observable,是 JetBrains 官方推荐的替代 RxJava 的工
2025-05-19 15:03:35
79
原创 flow-两种SharingStarted策略的区别示例
本文通过代码示例和日志分析,探讨了 Kotlin Flow 中 SharingStarted.Eagerly 和 SharingStarted.WhileSubscribed 两种启动模式的行为差异。Eagerly 模式会立即开始收集上游数据,而 WhileSubscribed 模式则仅在存在订阅者时才会启动收集。文章还解释了 StateFlow 的初始化机制,指出 Kotlin 属性的懒加载特性可能导致 stateIn 操作符的实际执行延迟。最后,文章详细说明了数据流的三个层次(上游、中间层、下游)以及
2025-05-19 14:58:58
259
原创 kotlin flow的写法
Kotlin Flow 是 Android 开发中处理异步数据流的强大工具,提供了丰富的操作符和模式来简化复杂的数据流处理。本文总结了 Flow 的常见使用场景和操作符,包括基本创建方式、转换操作符、Flow 组合、StateFlow 和 SharedFlow 的创建、Flow 控制操作、线程切换、错误处理等。此外,还介绍了 Flow 相比 LiveData 的优势,如更好的数据流组合能力、原生支持异步操作、流控支持等。Flow 在 ViewModel 状态管理、UI 响应、数据库和网络请求处理等场景中广泛
2025-05-19 13:43:04
195
原创 kotlin flow的两种SharingStarted策略的区别
SharingStarted 提供了两种策略来管理数据流的收集行为。SharingStarted.Eagerly 会立即开始收集数据,即使没有下游订阅者,确保数据始终最新,但会消耗更多资源。SharingStarted.WhileSubscribed(5000) 则仅在存在订阅者时开始收集,并在停止收集后等待 5000 毫秒才真正停止上游流,更节省资源但可能导致首次订阅时的延迟。选择策略时,应根据是否需要实时更新数据以及资源消耗的考虑来决定。示例中展示了 WhileSubscribed(5000) 的使用场
2025-05-19 11:52:01
209
原创 android setImageResource和setBackgroundResource区别
setImageResource和setBackgroundResource在Android开发中有显著区别。setImageResource用于设置ImageView的内容图片,支持ScaleType属性,图片会根据ImageView大小自动缩放,适合显示主要图片内容。而setBackgroundResource用于设置View的背景,不支持ScaleType,背景会铺满整个View,适合装饰性背景。在代码中,应使用setImageResource来正确显示图片,避免使用setBackgroundReso
2025-05-12 16:46:32
293
原创 kotlin flow防抖
防抖设计主要用于处理高频事件,如用户点击或数据流更新,以避免频繁触发逻辑或UI刷新。在点击事件中,防抖通过runDebounced函数限制用户输入频率,防止多次发送请求或切换状态。对于数据流(如StateFlow),使用.debounce()方法合并短时间内的多次状态变化,仅处理最后一次,从而降低UI响应频率,提升性能稳定性。防抖的核心目的是对高频事件进行节流,避免资源浪费和视觉抖动。建议在Fragment中实现防抖,因为Fragment控制UI层,能够灵活决定是否需要节流,而ViewModel应专注于状态
2025-05-10 19:46:54
827
原创 kotlin 数据类
Kotlin 的 data class 相比 Java 的普通类(POJO)在代码简洁性和功能上具有显著优势。data class 自动生成 getter/setter、equals()、hashCode()、toString() 和 copy() 方法,减少了大量样板代码。此外,data class 支持解构声明、默认不可变性(val),并与 Kotlin 的其他语言特性(如 sealed class、when 表达式)深度整合,提升了代码的可读性和可维护性。相比之下,Java 普通类需要手动编写这些方法
2025-05-09 22:26:04
833
原创 kotlin 03flow-stateFlow和sharedFlow企业中使用
在企业级 Kotlin 项目中,StateFlow和SharedFlow是与的核心工具,尤其在 MVVM 架构中扮演着极为关键的角色。
2025-05-05 19:26:23
1023
原创 kotlin 02flow-sharedFlow 完整教程
SharedFlow= Kotlin 中处理一次性事件的推荐工具,适合在ViewModel → UI 层传递 Toast、导航、弹窗等短暂行为,比LiveData更现代、可控。配置项意义replay新订阅者能收到多少“历史值”在未 collect 情况下,能暂存多少新值当缓存已满,是否丢老的、丢新的,或挂起等候总缓存条数据。
2025-05-05 18:49:51
1017
原创 kotlin 05flow -从 LiveData 迁移到 Kotlin Flow 完整教程
LiveData 长期以来是 Android 架构组件中状态管理的核心,但随着 Kotlin Flow 的成熟,Google 官方推荐将现有 LiveData 迁移到 Flow。本教程基于官方文章并扩展实践细节,完成平滑迁移。
2025-05-05 18:20:34
1124
原创 kotlin 01flow-StateFlow 完整教程
总是有当前值(初始值必须提供)只保留最新值支持多个观察者与 LiveData 类似但基于协程需求推荐使用需要保存并暴露当前状态(如 UI 状态)✅StateFlow需要发送一次性事件,如 Toast、导航✅SharedFlow想在订阅时立即拿到最后值✅StateFlow想发送多个相同值✅SharedFlow(StateFlow 会去重)
2025-05-05 18:13:26
629
原创 kotlin中枚举带参数和不带参数的区别
如果有明确的编号映射、需要从 Int 映射回枚举值 → 用第一段。如果只需要简单状态枚举,不关心映射逻辑 → 第二段更简洁。写法构造参数是否类成员是否能访问✅ 是❌ 否❌ 无法访问✅ 是✅ 是(只读)✅ 可以访问✅ 是✅ 是(可写)✅(不推荐)
2025-05-05 17:17:22
1212
原创 Kotlin 04Flow stateIn 和 shareIn的区别
何时使用stateIn?需要表示当前状态(有.value属性)UI 需要立即访问最新值适合:页面状态、表单数据、加载状态何时使用shareIn?处理一次性事件需要自定义缓冲策略适合:Toast 消息、导航事件、广播通知选择哪种started策略?:大多数 UI 场景Lazily:配置变更需保留数据Eagerly:需要预加载的全局数据通过本教程,应该已经掌握了shareIn和stateIn的核心用法和高级技巧。正确使用这两个操作符可以显著提升应用的性能和资源利用率。
2025-05-02 11:51:37
923
1
原创 android - Google官方推荐的App技术架构
Google推荐采用(首选)ViewModelStateFlowViewModelLiveDataStateFlowfill:#333;color:#333;color:#333;fill:none;事件调用更新数据新状态UIViewModelUseCaseRepositoryStateFlowsuspendsafe-argsAsyncTaskThread建议从项目入手,逐步实践分层架构和现代组件组合。
2025-05-02 09:00:24
609
原创 kotlin中 热流 vs 冷流 的本质区别
问题回答这是热流吗?✅ 是,StateFlow是热流会立即发射吗?✅ 会,本身就是当前值,first()立即得到在 ViewModel 中调用 first() 有问题吗?✅ 没问题,因为 StateFlow 不会挂起observeXXX(position) 取不到会崩吗?⚠️ 如果 map 中没初始化该 position,会崩溃(建议改为 getOrPut)StateFlow 管状态,SharedFlow 管事件。特性LiveDataFlowStateFlow是否冷流❌。
2025-05-01 17:01:11
1023
1
原创 计算机中的进制
问题回答什么是 16 进制?使用 0-F 表示的一种计数系统16进制是两个8进制吗?❌ 不是,是不同的计数系统如何表示 16 进制?使用前缀0x,例如0xFF0x 是什么意思?表示后面的数字是十六进制什么是 2 进制?只用 0 和 1 表示数据的系统16进制有 8 个二进制?❌ 一个 16 进制数占 4 位二进制,两个才占满一个 byte1 个 byte 有多少位?✅ 8 位byte 是几进制?byte 是数据类型,可以用任何进制表示。
2025-04-30 15:58:45
622
原创 编程中如何与AI交互-结构化输入和理解确认机制
类别建议🧱 提问方式使用结构化提问模板(背景、需求、问题、代码、提问)📏 控制长度保持代码精简,长代码分段或上传附件🎯 明确目标说清楚你想让 ChatGPT 做什么(找错?重构?优化?🔁 复用上下文同一问题连续追问时保持对话主题一致,不要改来改去🧠 自我校验想一想:“如果我是对方,看得懂我发的内容吗?背景:我在做什么?什么场景?(比如:Android 中 DataBinding 调按钮点击)需求:我想达到什么效果?(比如:想点击按钮时调用 ViewModel 方法)遇到的问题。
2025-04-29 14:36:33
1279
原创 座舱系统香氛模块概念
分类开关 vs 选择 vs 浓度香氛开关控制整个香氛模块是否喷洒(总开关)。香氛通道选择在多个香氛瓶之间选择当前要喷哪个(比如今天喷果香)。香氛浓度设置设置喷洒强度(比如香味是果香,强度是中等)。香氛初始化反馈确认模块是否正常可以工作,比如防止初始化失败。通道浓度百分比各个通道单独设定具体输出多少香味(细粒度控制)。香氛开关是是否工作,通道选择是喷哪个味道,浓度设置是喷多少,初始化反馈是确保模块能正常工作。信号方向主要目的香氛开关信号上层 → 模块控制整个香氛功能开关香氛初始化状态反馈。
2025-04-28 16:19:45
579
原创 android MutableLiveData 和 LiveData 的关系
LiveData是只读的可观察数据是可读可写的可观察数据。ViewModel 内部用对外暴露成LiveData这样就安全、清晰。List本质可观察的数据容器(Observable Data Holder)线性数据结构(存储元素)功能通知观察者数据变化保存有序元素变化感知支持(有 Observer 机制)不支持(变化别人不知道)生命周期感知支持(自动跟随 Activity/Fragment 生命周期)不支持单个值 or 多个值通常保存单个对象(也可以是 List 类型对象)
2025-04-28 09:06:31
819
原创 联想昭阳笔记本 风扇一键静音优化操作指南
项目设置电源模式平衡散热模式(联想Vantage)智能散热 / 静音模式启动项只保留必要驱动驱动&BIOS保持最新CPU 最大频率(可选)90%这样处理完,风扇基本在办公、网页、视频播放时候都很安静,只有打大型游戏或者重编译程序时才会呼呼响,这是正常的。联想有些机型,
2025-04-27 21:48:19
846
原创 android Observable 和Observer 是什么
角色解释Observable被观察者,即“被盯着看的对象”Observer观察者,即“盯着看的人”术语含义Observable被观察者,变化源Observer观察者,变化接收者。
2025-04-27 09:58:27
610
原创 为什么使用Throwable app不崩溃,使用Exception会崩溃
捕获方式能捕获Exception能捕获Error说明✅❌无法捕获✅✅能兜底处理所有异常与错误safeCall。
2025-04-25 10:25:28
333
原创 Android 性能测试教程
出现异常:卡顿、内存泄漏、过高耗电,要记录下来。对比基线:最好和历史版本数据对比。图表化结果:帧率、耗电量做成图表,方便展示。想做好 Android 性能测试,本质就是:掌握正确指标、熟练使用工具、规范操作流程。
2025-04-23 08:57:12
947
原创 android测试依赖
依赖库作用测试 LiveData 和其他架构组件的异步行为。核心单元测试框架,用于编写和运行本地测试。扩展 JUnit,提供 Android 特有的测试工具(如 ActivityScenario)。用于 UI 测试,模拟用户交互并验证 UI 行为。用于创建 Mock 对象,模拟依赖项的行为,简化复杂场景的测试。这些依赖共同构成了一个完整的测试环境,涵盖了从单元测试到 UI 测试的各种需求。根据测试目标选择合适的依赖即可!
2025-04-19 20:00:51
954
原创 android TabLayout用法
- res/layout/custom_tab.xml --> < LinearLayout ... > < ImageView ... /> < TextView android: text = " 首页 " /> </ LinearLayout >-- res/layout/custom_tab.xml --> < LinearLayout ... > < ImageView ... /> < TextView android: text = " 首页 " /> </ LinearLayout >
2025-04-17 09:12:09
457
原创 Android: gradient 使用
在 Android 中使用 gradient(渐变) 通常是通过 文件来设置背景。下面是可以直接用的几种用法汇总,包括线性渐变、径向渐变、扫描渐变(sweep)等:🔹 取值范围:0~360,表示渐变方向(0 为从上往下,90 为从左往右)。🔹 : 百分比(0.5 表示中心)🔹 : 渐变半径,单位为 px✅ 4. 多色渐变✅ 5. 设置背景到 View✅ 6. 代码中创建 GradientDrawable✅ 7. 圆角 + 渐变(常用)android:angle 方
2025-04-16 14:22:00
848
原创 背景模糊(Blur)效果
在 Android 中实现 背景模糊(Blur)效果 有多种方式,取决于你是:Android 12(API 31)开始,官方支持了 ,性能好、效果自然。✅ 方案二:使用 第三方库(支持 Android 6.0+)BlurView 是一个高性能开源库,适配性强,支持动态模糊、透明背景模糊等效果,适合做磨砂毛玻璃卡片背景等。最新版请参考 GitHub。✅ 初始化:✅ 方案三:使用自定义 View + (兼容性更强)RenderScript 适用于 Android 5.0-12,但 Andr
2025-04-14 16:07:17
446
原创 android中dp和px的关系
关于android的dp和px的关系是我刚开始学习android的第一个知识点,不知不觉学安卓也有一年了,但是偶然间我发现我理解的dp和px的关系一直是错的,真的是有一点搞笑,今天特意写一篇博客纪念一下这个我理解错一年的知识点。
2025-04-12 20:37:20
1165
原创 kotlin扩展函数
扩展函数是 Kotlin 提供的一种给已有类添加新函数的机制,不需要继承该类或者修改它的源码。fun <接收者类型>.<函数名>(参数列表): 返回类型 {// this 表示接收者对象使用时就像是这个函数是该类本身的方法一样调用。项目Kotlin 扩展函数定义方式使用方式编译原理被编译成静态方法,第一个参数是接收者对象本质语法糖 + 编译器重写调用方式是否是静态方法在 JVM 层面上是多态支持不支持(不能被子类重写)
2025-04-09 08:59:02
575
原创 android方向国外的AI工具以及与国内的对比
特性GPT-4oo1含义全功能旗舰模型精简版模型内部代号输入/输出文字 + 图像 + 音频文字(或多模态)GPT-4o 的代号强度⭐⭐⭐⭐⭐⭐~⭐⭐⭐成本较低(比 GPT-4-turbo 便宜)极低(适合大规模部署)用途专业 AI 应用实时响应、边缘设备研发/版本标识如果是做智能座舱、车载交互、语音控制系统相关开发的,GPT-4o-mini 这类模型就非常适合部署在终端设备中,响应快又省资源;而 GPT-4o 适合在云端进行更复杂的语义分析、多模态交互。
2025-04-08 18:02:03
606
原创 andorid 查找没有使用的资源
在菜单栏打开:File → Settings → Editor → Inspections搜索 “Unused resources”确保它被勾选 ✅然后再运行 “Inspect Code”,就能看到这类资源的提示了。
2025-04-08 09:58:00
1055
原创 Android Studio Logcat V2 使用指南(适配 2024 年版本)
Logcat V2 是 Android Studio Giraffe(海豚)版本后的新日志系统,使用统一的搜索框进行日志过滤,支持灵活的语法组合和正则表达式。这个过滤器可以帮助你专注于自己项目的日志,而不被系统底层输出干扰。package:包名。
2025-04-07 11:13:08
533
原创 Android studio xml布局预览中 Automotive和Autotive Distant Display的区别
指的是主车载中控屏,用于车辆的主要交互界面,如导航、媒体播放、空调控制等。:指的是辅助的远程显示屏,通常用于显示附加信息,或者为车主提供额外的交互方式,如后座娱乐显示、车内信息显示等。这两种设备类型主要的区别在于交互性和功能角色:前者是直接与车主交互的主要控制界面,而后者则是辅助的、非核心的显示设备,通常不会直接参与车载系统的核心操作。
2025-04-05 12:15:03
918
原创 Android Hilt 学习指南-代码部分
✅简化代码:与 Dagger 相比,需要的样板代码更少。✅易于学习和使用:依赖注入通过注解完成。✅自动生命周期管理:减少了手动管理实例的需求。✅官方支持:推荐用于 Android 开发。通过遵循本指南,已经学习了如何在ActivityViewModel和普通类中使用 Hilt 进行依赖注入。
2025-04-05 10:45:04
739
原创 android如何使用矢量图(svg)资源
最简单的方式是将 SVG 文件转换为,然后通过ImageView进行显示。如果不想手动转换,可以使用第三方库Glide或Picasso来直接加载并显示 SVG 文件。如果需要更多控制或者直接渲染 SVG 文件,可以使用AndroidSVG库。其中,使用是官方推荐的方式,尤其在 Android 5.0 以上版本,它提供了很好的性能和可扩展性。
2025-04-05 10:25:11
1032
原创 kotlin中主构造函数是什么
主构造函数(Primary Constructor)是 Kotlin 类声明的一部分,用于在 创建对象时初始化类的属性。它不像 Java 那样是一个函数体,而是紧跟在类名后面。上面这段代码中:等价于 Java 代码:如何初始化主构造函数中的类属性?在主构造函数中,类的属性可以通过以下几种方式初始化:这样 和 直接成为 类的属性,无需额外赋值。如果初始化逻辑较复杂,可以在 代码块中进行操作: 代码块会在 对象创建时 立即执行,并且按代码顺序先于次构造函数执行。Kotlin 允许给主构造函数
2025-04-04 21:45:34
1092
1
原创 kotlin中const 和val的区别
如果你需要声明常量并希望在编译时就确定其值,可以使用const。如果你只是需要声明不可变的变量,可以使用val。val: 相当于java中的final ,运行时确定变量的值,值固定const val 相当于java中 staic final,它的值在整个应用程序的生命周期内是固定的。
2025-04-04 21:04:53
544
android fragment生命周期测试
2018-04-24
自定义view-google文档代码整理
2018-04-01
自定义view学习一
2018-03-31
Android MVPDemo
2018-02-27
rxjava学习代码
2018-02-13
Office2010安装需要的MSXML文件
2018-02-10
Android photoWallDemo
2018-02-05
Android大屏幕适配demo
2018-02-02
VolleyDemo
2018-01-19
Android drawerLayout
2018-01-19
volley.jar文件
2018-01-11
RNRedux.zip
2020-07-23
AwesomeProject.zip
2020-02-15
app-debug.apk
2020-01-15
ContactBackupStudy.zip
2019-11-13
android-sdk_r24.4.1-windows
2018-11-06
sourceInsight4
2018-10-16
source_insight4.0破解版
2018-07-09
MarkdownPad2.5安装文件和注册码
2018-06-04
google浏览器字节码转换扩展程序
2018-05-26
gradle-4.7-all和gradle-4.7-bin
2018-05-09
gradle-3.4-all和gradle3.5-all
2018-05-09
跑马灯效果
2018-04-24
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人