- 博客(460)
- 资源 (77)
- 收藏
- 关注
原创 SharingStarted.Lazily 和 SharingStarted.WhileSubscribed(5000)`的区别
StateFlow的共享策略SharingStarted.Lazily和SharingStarted.WhileSubscribed(5000)主要区别在于资源管理:Lazily启动后永不停止收集数据,即使没有订阅者;而WhileSubscribed(5000)会在所有订阅者取消后延迟5秒自动停止上游Flow以节省资源。当前项目使用WhileSubscribed(5000)更适合资源敏感场景(如硬件连接),能有效减少无人订阅时的功耗;Lazily则适用于需要常驻数据的场景。
2025-07-10 15:27:46
241
原创 ImageView scaleType使用
ImageView的scaleType属性控制图片显示方式:fitCenter保持宽高比缩放至完整显示并居中;center保持原尺寸居中显示,超出部分裁剪;centerInside保持原尺寸,过大则缩小至完整显示;matrix直接显示原始像素,可能导致显示不全。不同方式适用于不同场景,可根据需求选择。
2025-07-10 14:50:24
106
原创 android activity生命周期温习
摘要:Android Activity的生命周期由一系列回调方法组成,包括onCreate()、onStart()、onResume()、onPause()、onStop()和onDestroy()。当应用退到后台时,会正常调用onPause()和onStop(),但onDestroy()不一定立即执行,它仅在Activity被主动销毁或系统回收资源时触发。理解这些方法的作用和调用时机对管理资源和用户体验至关重要。
2025-07-09 16:47:12
1057
原创 Kotlin 中主构造函数和次构造函数的区别
Kotlin构造函数解析:主次构造函数的区别与用法 本文详细介绍了Kotlin中的构造函数特性。主构造函数在类头部声明,最多一个,可声明属性,使用init块初始化;次构造函数在类体内,可有多个,必须调用主构造函数。主构造函数参数不加val/var时仅初始化可用,添加后成为类属性。constructor关键字在无修饰符时可省略,默认可见性为public。通过代码示例展示了各种构造函数的声明方式和使用场景,帮助开发者理解Kotlin构造函数的灵活设计。
2025-07-07 10:00:50
574
原创 adb logcat 查看日志
adb logcat是 Android 提供的日志输出工具,支持很多命令行参数(如-v-s-b等)来控制输出格式、过滤规则和日志缓冲区。
2025-07-06 12:41:35
438
原创 Android 一帧绘制流程
Android帧绘制流程解析 Android系统通过主线程和RenderThread双线程协作实现60FPS流畅体验。主线程负责UI逻辑、测量布局和生成绘制指令(Display List),必须在16.67ms内完成。RenderThread接管后,将指令转换为GPU命令,执行实际渲染和图层合成,最终在下一个Vsync信号到来时提交给SurfaceFlinger显示。主线程耗时过长会导致卡顿,而RenderThread/GPU负载过重则可能造成掉帧。优化要点包括减少主线程负担、简化视图层级、避免过度绘制和复
2025-07-02 15:17:14
913
原创 Android 性能分析必备知识点清单
只要掌握了上述知识点,也能逐步学会 trace 文件的分析和性能优化。建议每次分析 trace 时,先定位大头(主线程/渲染线程/内存),再结合代码和工具文档,逐步深入。性能优化是一个持续学习和实践的过程!
2025-07-02 10:08:05
901
原创 andorid app卡顿为什么需要profile工具进行分析
Android Studio Profiler工具是开发者分析应用性能问题的利器,能有效解决传统调试方法的不足。本文重点介绍了Profiler的两大核心功能: 卡顿分析与优化 通过CPU Profiler实时监控主线程阻塞情况 分析布局性能、过度绘制等问题 提供优化方案如异步加载、布局扁平化等 内存问题诊断 识别内存泄漏、内存抖动等常见问题 使用Memory Profiler监控内存使用 堆转储分析定位泄漏对象 Profiler工具提供可视化界面和多维度分析,帮助开发者精准定位性能瓶颈,优化应用流畅度和内存
2025-07-02 09:27:33
676
原创 bat脚本抓取android日志
本文介绍了两种通过bat脚本抓取Android设备日志的方法。第一种将日志保存到Windows本地,包括:1)抓取特定PID的应用程序日志;2)获取系统crash日志;3)过滤特定tag的日志。第二种方法将日志保存到Android设备存储卡中,同样包含上述三种日志类型,并会自动创建日志目录和删除旧文件。两种方法都使用adb命令,支持UTF-8编码输出,适合开发人员收集和分析Android系统及应用程序的运行日志。
2025-06-21 22:09:30
817
原创 里氏替换原则
(就像你爸的手机你能用,你的手机你爸也能用,谁用都不会出问题!假设你有一个类,它有个方法然后你写了个类继承✅Fileread()PDFFileTXTFileread()Listadd()❌RectanglesetWidth()SquareDatabaseconnect()connect()null。
2025-06-18 09:48:39
909
原创 android lifeCycleOwner生命周期
Android生命周期与ViewModel机制解析 Fragment中的repeatOnLifecycle(STARTED)只会在Fragment处于STARTED状态时执行数据收集,onPause时自动暂停,确保后台不更新UI。 ViewModel生命周期的关键点: 通过ViewModelProvider和ViewModelStore实现生命周期解耦 配置更改时保持存活,Activity/Fragment真正销毁时才清除 使用Kotlin委托属性(viewModels())实现延迟初始化和管理 Activ
2025-06-01 15:29:53
929
1
原创 android 图片背景毛玻璃效果实现
本文介绍了在Android中实现图片背景毛玻璃效果的方法。主要使用Glide库配合glide-transformations插件,通过BlurTransformation实现模糊效果。布局采用MaterialCardView包含背景ImageView,代码展示如何加载图片并应用25px半径模糊和半透明黑色遮罩。核心依赖包括Glide 4.16.0和wasabeef的变换库,通过简单配置即可实现美观的毛玻璃视觉效果。
2025-05-28 17:16:50
345
原创 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
434
原创 flow-两种SharingStarted策略的区别示例
本文通过代码示例和日志分析,探讨了 Kotlin Flow 中 SharingStarted.Eagerly 和 SharingStarted.WhileSubscribed 两种启动模式的行为差异。Eagerly 模式会立即开始收集上游数据,而 WhileSubscribed 模式则仅在存在订阅者时才会启动收集。文章还解释了 StateFlow 的初始化机制,指出 Kotlin 属性的懒加载特性可能导致 stateIn 操作符的实际执行延迟。最后,文章详细说明了数据流的三个层次(上游、中间层、下游)以及
2025-05-19 14:58:58
935
原创 kotlin flow的写法
Kotlin Flow 是 Android 开发中处理异步数据流的强大工具,提供了丰富的操作符和模式来简化复杂的数据流处理。本文总结了 Flow 的常见使用场景和操作符,包括基本创建方式、转换操作符、Flow 组合、StateFlow 和 SharedFlow 的创建、Flow 控制操作、线程切换、错误处理等。此外,还介绍了 Flow 相比 LiveData 的优势,如更好的数据流组合能力、原生支持异步操作、流控支持等。Flow 在 ViewModel 状态管理、UI 响应、数据库和网络请求处理等场景中广泛
2025-05-19 13:43:04
593
原创 kotlin flow的两种SharingStarted策略的区别
SharingStarted 提供了两种策略来管理数据流的收集行为。SharingStarted.Eagerly 会立即开始收集数据,即使没有下游订阅者,确保数据始终最新,但会消耗更多资源。SharingStarted.WhileSubscribed(5000) 则仅在存在订阅者时开始收集,并在停止收集后等待 5000 毫秒才真正停止上游流,更节省资源但可能导致首次订阅时的延迟。选择策略时,应根据是否需要实时更新数据以及资源消耗的考虑来决定。示例中展示了 WhileSubscribed(5000) 的使用场
2025-05-19 11:52:01
539
原创 android setImageResource和setBackgroundResource区别
setImageResource和setBackgroundResource在Android开发中有显著区别。setImageResource用于设置ImageView的内容图片,支持ScaleType属性,图片会根据ImageView大小自动缩放,适合显示主要图片内容。而setBackgroundResource用于设置View的背景,不支持ScaleType,背景会铺满整个View,适合装饰性背景。在代码中,应使用setImageResource来正确显示图片,避免使用setBackgroundReso
2025-05-12 16:46:32
364
原创 kotlin flow防抖
防抖设计主要用于处理高频事件,如用户点击或数据流更新,以避免频繁触发逻辑或UI刷新。在点击事件中,防抖通过runDebounced函数限制用户输入频率,防止多次发送请求或切换状态。对于数据流(如StateFlow),使用.debounce()方法合并短时间内的多次状态变化,仅处理最后一次,从而降低UI响应频率,提升性能稳定性。防抖的核心目的是对高频事件进行节流,避免资源浪费和视觉抖动。建议在Fragment中实现防抖,因为Fragment控制UI层,能够灵活决定是否需要节流,而ViewModel应专注于状态
2025-05-10 19:46:54
902
原创 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
934
原创 kotlin 03flow-stateFlow和sharedFlow企业中使用
在企业级 Kotlin 项目中,StateFlow和SharedFlow是与的核心工具,尤其在 MVVM 架构中扮演着极为关键的角色。
2025-05-05 19:26:23
1075
原创 kotlin 02flow-sharedFlow 完整教程
SharedFlow= Kotlin 中处理一次性事件的推荐工具,适合在ViewModel → UI 层传递 Toast、导航、弹窗等短暂行为,比LiveData更现代、可控。配置项意义replay新订阅者能收到多少“历史值”在未 collect 情况下,能暂存多少新值当缓存已满,是否丢老的、丢新的,或挂起等候总缓存条数据。
2025-05-05 18:49:51
1075
原创 kotlin 05flow -从 LiveData 迁移到 Kotlin Flow 完整教程
LiveData 长期以来是 Android 架构组件中状态管理的核心,但随着 Kotlin Flow 的成熟,Google 官方推荐将现有 LiveData 迁移到 Flow。本教程基于官方文章并扩展实践细节,完成平滑迁移。
2025-05-05 18:20:34
1204
原创 kotlin 01flow-StateFlow 完整教程
总是有当前值(初始值必须提供)只保留最新值支持多个观察者与 LiveData 类似但基于协程需求推荐使用需要保存并暴露当前状态(如 UI 状态)✅StateFlow需要发送一次性事件,如 Toast、导航✅SharedFlow想在订阅时立即拿到最后值✅StateFlow想发送多个相同值✅SharedFlow(StateFlow 会去重)
2025-05-05 18:13:26
854
原创 kotlin中枚举带参数和不带参数的区别
如果有明确的编号映射、需要从 Int 映射回枚举值 → 用第一段。如果只需要简单状态枚举,不关心映射逻辑 → 第二段更简洁。写法构造参数是否类成员是否能访问✅ 是❌ 否❌ 无法访问✅ 是✅ 是(只读)✅ 可以访问✅ 是✅ 是(可写)✅(不推荐)
2025-05-05 17:17:22
1246
原创 Kotlin 04Flow stateIn 和 shareIn的区别
何时使用stateIn?需要表示当前状态(有.value属性)UI 需要立即访问最新值适合:页面状态、表单数据、加载状态何时使用shareIn?处理一次性事件需要自定义缓冲策略适合:Toast 消息、导航事件、广播通知选择哪种started策略?:大多数 UI 场景Lazily:配置变更需保留数据Eagerly:需要预加载的全局数据通过本教程,应该已经掌握了shareIn和stateIn的核心用法和高级技巧。正确使用这两个操作符可以显著提升应用的性能和资源利用率。
2025-05-02 11:51:37
1008
2
原创 android - Google官方推荐的App技术架构
Google推荐采用(首选)ViewModelStateFlowViewModelLiveDataStateFlowfill:#333;color:#333;color:#333;fill:none;事件调用更新数据新状态UIViewModelUseCaseRepositoryStateFlowsuspendsafe-argsAsyncTaskThread建议从项目入手,逐步实践分层架构和现代组件组合。
2025-05-02 09:00:24
684
原创 kotlin中 热流 vs 冷流 的本质区别
问题回答这是热流吗?✅ 是,StateFlow是热流会立即发射吗?✅ 会,本身就是当前值,first()立即得到在 ViewModel 中调用 first() 有问题吗?✅ 没问题,因为 StateFlow 不会挂起observeXXX(position) 取不到会崩吗?⚠️ 如果 map 中没初始化该 position,会崩溃(建议改为 getOrPut)StateFlow 管状态,SharedFlow 管事件。特性LiveDataFlowStateFlow是否冷流❌。
2025-05-01 17:01:11
1129
3
原创 计算机中的进制
问题回答什么是 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
680
原创 编程中如何与AI交互-结构化输入和理解确认机制
类别建议🧱 提问方式使用结构化提问模板(背景、需求、问题、代码、提问)📏 控制长度保持代码精简,长代码分段或上传附件🎯 明确目标说清楚你想让 ChatGPT 做什么(找错?重构?优化?🔁 复用上下文同一问题连续追问时保持对话主题一致,不要改来改去🧠 自我校验想一想:“如果我是对方,看得懂我发的内容吗?背景:我在做什么?什么场景?(比如:Android 中 DataBinding 调按钮点击)需求:我想达到什么效果?(比如:想点击按钮时调用 ViewModel 方法)遇到的问题。
2025-04-29 14:36:33
1341
原创 座舱系统香氛模块概念
分类开关 vs 选择 vs 浓度香氛开关控制整个香氛模块是否喷洒(总开关)。香氛通道选择在多个香氛瓶之间选择当前要喷哪个(比如今天喷果香)。香氛浓度设置设置喷洒强度(比如香味是果香,强度是中等)。香氛初始化反馈确认模块是否正常可以工作,比如防止初始化失败。通道浓度百分比各个通道单独设定具体输出多少香味(细粒度控制)。香氛开关是是否工作,通道选择是喷哪个味道,浓度设置是喷多少,初始化反馈是确保模块能正常工作。信号方向主要目的香氛开关信号上层 → 模块控制整个香氛功能开关香氛初始化状态反馈。
2025-04-28 16:19:45
628
原创 android MutableLiveData 和 LiveData 的关系
LiveData是只读的可观察数据是可读可写的可观察数据。ViewModel 内部用对外暴露成LiveData这样就安全、清晰。List本质可观察的数据容器(Observable Data Holder)线性数据结构(存储元素)功能通知观察者数据变化保存有序元素变化感知支持(有 Observer 机制)不支持(变化别人不知道)生命周期感知支持(自动跟随 Activity/Fragment 生命周期)不支持单个值 or 多个值通常保存单个对象(也可以是 List 类型对象)
2025-04-28 09:06:31
904
原创 联想昭阳笔记本 风扇一键静音优化操作指南
项目设置电源模式平衡散热模式(联想Vantage)智能散热 / 静音模式启动项只保留必要驱动驱动&BIOS保持最新CPU 最大频率(可选)90%这样处理完,风扇基本在办公、网页、视频播放时候都很安静,只有打大型游戏或者重编译程序时才会呼呼响,这是正常的。联想有些机型,
2025-04-27 21:48:19
1318
原创 android Observable 和Observer 是什么
角色解释Observable被观察者,即“被盯着看的对象”Observer观察者,即“盯着看的人”术语含义Observable被观察者,变化源Observer观察者,变化接收者。
2025-04-27 09:58:27
691
原创 为什么使用Throwable app不崩溃,使用Exception会崩溃
捕获方式能捕获Exception能捕获Error说明✅❌无法捕获✅✅能兜底处理所有异常与错误safeCall。
2025-04-25 10:25:28
347
原创 Android 性能测试教程
出现异常:卡顿、内存泄漏、过高耗电,要记录下来。对比基线:最好和历史版本数据对比。图表化结果:帧率、耗电量做成图表,方便展示。想做好 Android 性能测试,本质就是:掌握正确指标、熟练使用工具、规范操作流程。
2025-04-23 08:57:12
1331
原创 android测试依赖
依赖库作用测试 LiveData 和其他架构组件的异步行为。核心单元测试框架,用于编写和运行本地测试。扩展 JUnit,提供 Android 特有的测试工具(如 ActivityScenario)。用于 UI 测试,模拟用户交互并验证 UI 行为。用于创建 Mock 对象,模拟依赖项的行为,简化复杂场景的测试。这些依赖共同构成了一个完整的测试环境,涵盖了从单元测试到 UI 测试的各种需求。根据测试目标选择合适的依赖即可!
2025-04-19 20:00:51
974
原创 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
898
Office2010安装需要的MSXML文件
2018-02-10
Android大屏幕适配demo
2018-02-02
retrofit2与rxjava结合的demo
2018-03-01
VolleyDemo
2018-01-19
自定义view学习一
2018-03-31
自定义view-google文档代码整理
2018-04-01
Android MVPDemo
2018-02-27
rxjava学习代码
2018-02-13
Android drawerLayout
2018-01-19
volley.jar文件
2018-01-11
android fragment生命周期测试
2018-04-24
Android photoWallDemo
2018-02-05
RNRedux.zip
2020-07-23
跑马灯效果
2018-04-24
ContactBackupStudy.zip
2019-11-13
gradle-3.4-all和gradle3.5-all
2018-05-09
app-debug.apk
2020-01-15
MarkdownPad2.5安装文件和注册码
2018-06-04
android-sdk_r24.4.1-windows
2018-11-06
AwesomeProject.zip
2020-02-15
source_insight4.0破解版
2018-07-09
gradle-4.7-all和gradle-4.7-bin
2018-05-09
sourceInsight4
2018-10-16
google浏览器字节码转换扩展程序
2018-05-26
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人