- 博客(512)
- 资源 (77)
- 收藏
- 关注
原创 compose中 RememberObserver / RetainObserver 是什么
摘要: RememberObserver和RetainObserver是Jetpack Compose中用于管理状态对象生命周期的底层接口,分别通过remember和retain触发回调。它们解决了对象构造与实际使用不同步的问题(如资源泄漏风险),但官方明确反对在业务代码中直接使用。推荐通过DisposableEffect、ViewModel等高层API管理副作用。仅建议在开发基础库、强绑定资源的对象(如播放器)等少数场景中使用。项目中未出现这些接口反而是合理设计的体现,表明遵循了Compose的最佳实践。
2025-12-29 12:18:08
582
原创 compose中 remember retain rememberSaveable、rememberSerializable的区别
Jetpack Compose 提供了不同层级的状态管理API,解决状态生命周期问题。remember仅对抗重组,适合临时UI状态;retain保持实例跨配置变化,适合不可序列化的大对象;rememberSaveable基于SavedState机制,保存用户输入等状态;rememberSerializable使用kotlinx序列化保存纯数据状态。官方推荐优先级:ViewModel > rememberSaveable/rememberSerializable > retain > rem
2025-12-29 10:58:31
1013
原创 compose @stable概念和作用3
Compose重组优化本质上是规模效应而非单点效应。对于简单组件(如Counter),重组成本微乎其微(仅函数执行、字符串计算),无需过度优化。真正的性能瓶颈出现在复杂组件树(如带LazyColumn的列表)中,此时无意义重组会引发指数级成本增长(Modifier重建、布局计算等)。工程实践建议:先保证正确性,再根据性能指标针对性优化。判断标准是:不含延迟加载/动画/复杂修饰符的纯UI组件,其重组成本可忽略。成熟的Compose思维应权衡优化必要性,而非盲目追求稳定性标记。
2025-12-26 17:44:13
417
原创 compose中@Stable概念和作用2
摘要:Jetpack Compose中的父子关系由组合树决定,调用者即为父Composable。父重组会触发子重组,但参数稳定性(如@Stable注解)可阻止不必要重组。重组是自上而下传播的,普通类参数会导致子必重组,而稳定参数能截断重组链。关键点在于:父是调用你的Composable,父重组时子是否重组取决于参数稳定性。这解释了Compose的重组机制与优化原理。
2025-12-26 17:39:24
317
原创 compose中的@Stable概念和用法
摘要:@Stable注解的核心作用是告诉Compose编译器某个类的变化是可预测的,而非不可变。它通过改变参数比较策略、启用skip优化和精确推断状态依赖,显著减少不必要的重组。与@Immutable不同,@Stable允许可变但要求变化可追踪,适用于UI State等频繁参与重组判断的场景。正确使用可提升复杂界面性能,但需注意仅对受控变化的对象使用,避免误标导致UI不更新。本质上,@Stable是开发者向Compose作出的性能承诺。
2025-12-26 17:29:22
556
原创 compose Effect概念
Compose中的Effect(副作用):在UI声明之外影响外部世界的操作,如启动协程、网络请求等。由于Composable函数会被反复执行且结果可能被丢弃,副作用必须通过Effect API(如LaunchedEffect、SideEffect)管理,确保只在成功重组后执行。Effect是连接UI与外部系统的桥梁,在MVI架构中协调State与外部交互。核心原则:若代码离开Composable仍有效,就必须封装为Effect。
2025-12-26 15:48:27
656
原创 compose中的rememberSaveable
摘要:在MVI+Compose架构中,ViewModel作为主要状态容器替代了rememberSaveable的核心功能,但两者定位不同。ViewModel负责业务状态(单一数据源),rememberSaveable仅处理UI层临时状态(如输入框、Tab索引)。健康项目通常表现为:多用ViewModel和remember,少用rememberSaveable。关键区别在于ViewModel具备完整生命周期管理能力,而rememberSaveable更适合非业务UI状态恢复。工程实践中应避免将业务逻辑放入UI
2025-12-26 15:36:47
863
原创 compose中 SideEffect概念以及作用
摘要:SideEffect在Compose中的执行时机是在重组完成并提交UI变更后,而非函数最后一行执行完立刻执行。日志显示顺序执行是因为SideEffect在函数执行时被注册,实际执行发生在重组确认成功后。与LaunchedEffect不同,SideEffect是同步执行且保证不受重组打断,确保副作用在UI状态稳定后执行。这种设计避免了因UI计算回滚导致的世界状态不一致问题。
2025-12-26 14:37:21
595
原创 compose中 DisposableEffect和onDispose
本文系统讲解了Compose中DisposableEffect和onDispose的核心概念与使用模式。DisposableEffect是生命周期作用域,onDispose是其清理回调。关键点包括:1) DisposableEffect在进入组合时执行,key变化或离开组合时触发onDispose;2) 标准模式是在effect中注册资源,在onDispose中清理;3) key决定生命周期边界;4) 与LaunchedEffect的区别在于解决资源对称性问题;5) 常见反模式包括只注册不清理或在onDis
2025-12-26 14:17:44
305
原创 compose重组概念2
重组(Recomposition)是Compose在状态变化时重新执行依赖该状态的Composable函数,生成新的UI描述树并进行差异更新。关键点:1)只有特定状态变化才会触发;2)仅更新变化的UI节点;3)自动执行最小范围重组。重组不等于重新绘制,而是重新计算UI。开发者应避免在重组中执行不必要操作,而非害怕重组本身。Compose通过智能重组机制实现高效UI更新。
2025-12-26 13:45:46
316
原创 Compose重组的概念1
重组(Recomposition)是 Compose 的核心机制,指当状态变化时重新执行受影响的 Composable 函数生成新 UI 描述,而非重新绘制整个界面。重组是声明式 UI(UI=f(State))的必然结果,其关键在于: 本质:仅重新计算受状态变化影响的函数,通过 Diff 算法局部更新 成功重组:需完成 UI Tree 计算且未被中断,此时才会触发 SideEffect(用于同步外部状态) 性能优化:应关注重组范围控制(如使用 derivedStateOf)而非避免重组 SideEffect
2025-12-26 13:43:07
846
原创 Compose 重组机制详解文档
Compose 重组机制通过智能局部刷新优化性能,关键点包括: remember 保留状态避免重复创建,无 remember 时状态会在每次重组时重置 重组会重新执行整个函数,但通过差异对比只更新实际变化的部分 最小重组粒度是 Composable 函数,但通过内容对比实现局部刷新 优化策略包括合理使用 remember、传递最小参数、跳过不变子树 状态变化触发函数重组,但未变化的 UI 元素会被跳过绘制 该机制在保持声明式编程的同时实现了高效渲染。
2025-12-26 10:40:26
837
原创 Compose 快速参考卡片
Jetpack Compose 快速参考摘要 常用代码模板: Screen标准模板包含状态观察、初始化和UI渲染三部分 使用collectAsStateWithLifecycle()观察ViewModel状态 通过LaunchedEffect处理副作用和初始化 状态管理: 组件内状态使用remember + mutableStateOf 可保存状态用rememberSaveable ViewModel状态通过StateFlow管理 布局组件: Column/Row/Box三大基础布局 LazyColumn实
2025-12-25 13:32:02
308
原创 compose中的Modifier
Jetpack Compose 中的 Modifier 是用于修饰和配置组件的核心工具,可替代 XML 布局中的多种属性。它具有无侵入性、顺序敏感和可组合的特点,支持链式调用。常用 Modifier 分为布局(如 size、padding)、样式(如 background、clip)、交互(如 clickable)等功能。与 XML 相比,Modifier 执行顺序会影响效果(如 padding 和 background 的顺序),且不可变。开发者还可自定义 Modifier 扩展功能,实现更灵活的 UI
2025-12-25 13:24:35
361
原创 Compose基础入门
Jetpack Compose基础入门摘要 Jetpack Compose是Android的现代UI工具包,采用声明式Kotlin代码替代传统XML布局。核心特点包括: 使用@Composable注解标记UI函数 通过Modifier控制组件样式和布局 状态驱动UI,自动响应数据变化 提供Box(层叠)、Column(垂直)等基础布局 条件渲染使用when表达式实现不同状态UI 典型结构示例: @Composable fun MyScreen() { Box(modifier = Modifier.fill
2025-12-25 13:22:09
784
原创 Compose 中内外padding
摘要:Jetpack Compose中padding和background的顺序决定了内外边距效果。在Modifier中,先写的padding会形成外边距(类似margin),后写的padding则成为内边距(类似padding)。示例代码展示了Text被层层包裹的过程:最内层padding(10.dp)形成内容内边距,background(Color.Blue)包裹该区域,最外层padding(20.dp)形成外边距。与XML布局对比,Compose通过调整Modifier顺序实现margin效果。记忆口
2025-12-25 13:15:34
243
原创 Compose 实战练习
Compose 实战练习摘要 本文档提供了一套递进式Compose开发练习,分3个难度级别: 1️⃣ 基础理解(30分钟/练习) 添加日志打印:理解MVI数据流 修改UI文本:学习简单UI调整 改变组件颜色:掌握主题颜色应用 2️⃣ 组件理解(1小时内) 添加搜索框:实践新组件集成 调整列表高度:学习布局微调 3️⃣ 状态管理(45分钟) 实现删除功能:完整MVI流程实践 新增Intent ViewModel处理 UI交互实现 每个练习包含: 明确目标 具体代码位置 修改建议 验证方法 关键知识点 难度标记
2025-12-25 12:02:16
865
原创 Compose 快速参考卡片(速查表)
Jetpack Compose 快速参考卡片提供了MVI架构的核心概念和常用代码片段。主要包含: MVI数据流模型:State←Intent→UI更新的单向数据流 三大核心概念:State(状态)、Intent(意图)、Effect(副作用) 常用代码模板:包括Composable结构、状态更新、Intent处理等 Modifier速查:布局、间距、背景、点击等常用修饰符组合 布局容器对比:Column/Row/Box/Lazy系列等适用场景 状态管理:包括加载状态和对话框状态的枚举处理 副作用处理:使用L
2025-12-25 11:55:52
572
原创 compose中 关于 size、width 和 height 的关系
摘要:本文解析了Compose布局中size、width和height的关系与区别。size()会同时设置宽高为相同值,而width()和height()可单独控制不同维度。重点说明了修饰符的执行顺序(从前往后)及覆盖规则,指出后面的修饰符会覆盖前面的同类型设置。通过示例展示了size(100.dp)、width(200.dp)和height(100.dp)组合使用时最终形成的200dp×100dp尺寸效果,强调了这些修饰符在实际应用中的叠加特性。
2025-12-25 11:11:42
171
原创 Compose 核心组件学习指南
Compose 核心组件指南 📐 Modifier - UI修饰工具链 控制大小、边距、背景、边框等样式 支持链式组合:fillMaxWidth().padding(16.dp).background(Color.LightGray) 🎛️ 布局容器 Box:堆叠布局(图片+文字) Column/Row:线性排列 LazyColumn:高性能列表(带滚动记忆) 📝 基础组件 Text:支持字体样式、对齐、溢出处理 Image/Icon:图片显示与图标 Button:可自定义颜色/圆角的交互控件 💡
2025-12-25 11:01:14
327
原创 android内存泄露_什么是内存泄露
摘要:Android内存泄漏是指无用对象因被错误引用导致无法回收的现象,会引发卡顿、OOM等问题。常见原因包括:长生命周期对象持有短生命周期对象引用(如静态变量引用Activity)、未注销监听器/回调、资源未关闭、集合未清理等。检测工具推荐Android Profiler、LeakCanary和MAT。避免方法包括:使用弱引用、及时注销监听器、关闭资源、优先用Application Context等。核心解决思路是规范生命周期管理并合理处理对象引用。
2025-11-19 10:51:39
609
原创 android内存泄露_LeakCanary
LeakCanary通过自动化检测和分析内存泄漏,显著简化了Android开发中的内存管理难题。它首先监控Activity/Fragment的生命周期,在销毁时创建弱引用和引用队列,随后手动触发GC进行检测。若对象未被回收,则生成HPROF堆转储文件,使用Shark分析库解析引用链,找出从GC Root到泄漏对象的路径。最终提供直观的报告,包括泄漏对象、引用链及修复建议,帮助开发者快速定位静态变量持有等常见问题。整个过程将复杂的手动分析自动化,极大提升了内存泄漏排查效率。
2025-11-19 10:22:05
434
原创 扩展函数的特点
Kotlin扩展函数是一种在不修改原类源码的情况下为其"添加"新方法的语法特性,底层通过静态方法实现。相比Java需要通过继承、工具类或包装类等方式扩展功能,Kotlin扩展函数具有更直观的调用方式(对象.方法())和更好的代码组织性。Java没有原生支持扩展函数主要是缺乏语法层面的支持,而非技术限制。Kotlin通过语法糖优化了这一功能体验,使其成为解决类扩展问题的优雅方案。
2025-11-17 15:39:34
906
原创 android RecycledViewPool的作用
频繁创建ViewHolder的原因:高频出现的viewType对应的缓存池容量不足(默认 5 个),导致滑出屏幕的ViewHolder被销毁,再次需要时只能重新创建。默认容量:每种viewType最多缓存 5 个ViewHolder。与viewType的关系:缓存池按viewType隔离,不同类型的ViewHolder不能复用,因此高频类型需要更大的缓存容量。通过为高频viewType增大缓存池容量,能提升复用率,减少ViewHolder创建次数,优化列表滑动性能。
2025-11-13 13:00:15
936
原创 android recyclerview缓存_缓存问题解决办法
缓存导致的异常,本质是“缓存复用的ViewHolder状态”与“当前数据状态”不匹配。规范复用流程:在中全面重置状态,确保缓存的ViewHolder与新数据完全同步。优化缓存配置:合理定义viewType、调整缓存池容量、启用稳定 ID 等,提升缓存命中率。清理残留状态:通过或任务校验,避免异步操作干扰复用后的ViewHolder。理解这些策略不仅能解决具体问题,更能体现对缓存机制的深度掌握,在面试中也是加分项。
2025-11-13 12:55:22
874
原创 android recyclerview缓存2_四级缓存机制
RecyclerView采用精妙的四级缓存机制保证流畅滑动:1)Scrap缓存暂存屏幕内临时移除项;2)CachedViews保存最近2个离屏项;3)可选的ViewCacheExtension支持自定义缓存;4)RecycledViewPool实现全局viewType分类复用。查找顺序严格按1→4级进行,未命中才创建新ViewHolder。RecycledViewPool支持多列表共享复用,显著减少创建开销。该机制通过优先复用、按需创建的设计,在内存占用和性能间取得平衡,有效避免了频繁的onCreateVi
2025-11-13 11:22:13
742
原创 android recyclerview缓存1_概念和常见问题
的缓存机制通过四级缓存实现了ViewHolder的高效复用,核心目标是减少 View 创建和数据绑定的开销。理解其工作流程后,能更清晰地定位数据错乱、卡顿等问题——本质都是缓存复用与数据更新不同步导致的。面试中,除了阐述缓存层级,还需结合实际问题(如数据错乱的解决)说明对原理的理解,体现实战能力。开发中,需根据列表特点(如是否固定宽高、数据是否动态变化)合理配置缓存参数,才能充分发挥的性能优势。
2025-11-13 11:00:30
679
原创 android RecyclerView 解决列表页面闪烁问题
setHasFixedSize(true)优化RecyclerView性能,通过固定Item宽高避免数据更新时重新计算布局导致的闪烁。适用于Item尺寸固定的列表,配合DiffUtil和局部刷新效果更佳。原理是跳过全局布局计算,保持列表稳定性。需注意不适用于动态调整高度的场景。代码示例展示了简单实现方式,是列表优化的重要手段。
2025-11-13 10:32:27
182
原创 android RecyclerView多item写法
在RecyclerView中实现多类型Item的核心是通过ViewType区分不同数据模型和布局。主要步骤包括:定义不同数据类并实现统一接口,为每个类型创建独立布局和ViewHolder,在Adapter中根据ViewType返回对应布局并绑定数据。代码示例展示了如何通过getItemViewType()判断数据类型,在onCreateViewHolder()中加载不同布局,并在onBindViewHolder()中调用对应ViewHolder的绑定方法。这种方法使RecyclerView能够灵活展示多种样
2025-11-13 10:30:53
475
原创 kotlin 协程的用法
本文从原理到实践解析了Kotlin协程在Android开发中的应用。协程是轻量级的线程任务调度单元,通过挂起机制实现异步代码同步化写法,相比线程具有创建成本低、切换轻量等优势。在Android中,通过不同作用域管理协程生命周期:Activity/Fragment使用lifecycleScope自动绑定,ViewModel使用viewModelScope,数据层则采用挂起函数配合IO调度器。文章还介绍了协程的关键语法如launch/async/withContext,以及异常处理和取消机制,为开发者提供了协程
2025-11-10 13:50:44
806
原创 kotlin lambda表达式和高阶函数
本文介绍了Kotlin中的Lambda表达式和高阶函数。Lambda表达式是匿名函数,可像对象一样传递和存储,语法为{参数->函数体}。高阶函数是以函数为参数或返回值的函数,支持两种形式:函数参数和函数返回值。文章通过多个示例展示了高阶函数的应用,包括标准库函数forEach、map、filter,以及Android中的点击监听和协程使用。最后总结指出,高阶函数配合Lambda能使代码更简洁灵活,并对比了Lambda、高阶函数和闭包的特点。
2025-11-10 13:49:48
401
原创 kotlin lambda表达式和高阶函数
本文介绍了Kotlin中的Lambda表达式和高阶函数。Lambda表达式是匿名函数,可像对象一样传递和存储,语法为{参数->函数体}。高阶函数是以函数为参数或返回值的函数,支持两种形式:函数参数和函数返回值。文章通过多个示例展示了高阶函数的应用,包括标准库函数forEach、map、filter,以及Android中的点击监听和协程使用。最后总结指出,高阶函数配合Lambda能使代码更简洁灵活,并对比了Lambda、高阶函数和闭包的特点。
2025-11-10 13:46:47
442
原创 android事件分发机制
Android View事件分发机制的核心流程是:触摸事件从Activity开始,经由Window和DecorView,层层传递给根ViewGroup。ViewGroup通过dispatchTouchEvent()分发事件,用onInterceptTouchEvent()决定是否拦截,若不拦截则传递给子View。子View通过onTouchEvent()处理事件,返回true则消费事件,false则回溯给父容器。整个过程遵循"谁返回true谁消费事件"的规则,最终决定事件的流向和处理。
2025-11-10 13:36:04
834
原创 android Fragment hide,show,replace等用法
摘要:本文系统解析了Android Fragment管理中add/hide/show和replace/remove的核心区别与使用场景。add/hide/show方案适合频繁切换的Tab页面(如底部导航),保持Fragment实例避免重复创建;而replace适合临时跳转场景,会销毁旧实例释放内存。文章通过对比表格、生命周期流程和典型示例,给出选择建议:多页面共存用hide/show,单页面流转用replace,并强调关键差异在于性能优化与内存管理的权衡。(149字)
2025-11-10 13:11:57
384
原创 android启动模式使用场景具体说明
摘要: Android 的 singleTop、singleTask 和 singleInstance 是 Activity 的启动模式,用于优化任务栈管理和实例复用。singleTop 复用栈顶实例,适用于通知跳转(如搜索页);singleTask 确保栈内单例并清理上方 Activity,适合主页面(如微信首页);singleInstance 独占独立栈,用于全局唯一功能(如来电界面)。登录页和设置页不建议设为 singleTask,可能破坏操作连贯性,建议使用 standard 或 singleTop
2025-11-10 12:49:26
785
原创 android日志-问题定位
本文摘要了Android应用问题定位的关键方法:1)ANR日志通过"ANR in"和"Reason"字段快速定位;2)闪退问题重点关注"exception"和"caused by"关键字,建议从日志尾部逆向查找错误;3)针对不同层级的闪退,应用层关注"FATAL EXCEPTION"和调用堆栈,系统层注意"E"级错误日志模式。日志分析时应优先检查报错行前3-4行的上下文,以提高问题定位效率
2025-11-10 11:30:53
250
2
原创 Android Hilt 入门教程_传统写法和Hilt写法的比较
Hilt 之所以是对象工厂和生命周期管家,是因为它能够自动创建并管理依赖对象,并且可以自动适配依赖对象的生命周期,避免手动管理带来的复杂性和潜在的内存泄漏。🎭 1. Hilt 是对象工厂(自动创建并管理依赖对象)private val apiService = ApiService() // 直接创建实例。
2025-11-08 14:52:06
884
原创 Android Hilt 入门教程_注解汇总
Hilt依赖注入核心注解解析 @Inject是Hilt的核心注解,主要提供两种注入方式: 构造函数注入 - 通过@Inject constructor()自动创建类实例,适用于无状态类 字段注入 - 使用@Inject lateinit var在Activity/Fragment中自动注入依赖 其他关键Hilt注解包括: @HiltAndroidApp:标记Application类,初始化Hilt @AndroidEntryPoint:使Activity/Fragment支持依赖注入 @Module + @
2025-11-08 14:50:17
1019
原创 Android Hilt 入门教程_Hilt原理
Hilt是基于Dagger的依赖注入框架,通过编译时代码生成自动管理对象的创建、注入和生命周期。其核心原理包括:1)通过@Inject和@Module/@Providers定义依赖关系图;2)利用作用域注解(@Singleton等)将对象与Android组件生命周期绑定;3)支持测试环境下依赖替换;4)实现代码解耦,使业务逻辑仅依赖抽象接口。Hilt通过分层组件结构(SingletonComponent、ActivityComponent等)实现作用域管理,让依赖项随组件生命周期自动释放,显著提高代码可维护
2025-11-08 14:48:46
710
原创 Android Hilt 入门教程_实战
Android Hilt 依赖注入框架入门教程 Hilt 是 Android 官方推荐的依赖注入框架,基于 Dagger 但更简单易用。本文介绍 Hilt 的基本使用方法和优势,帮助开发者快速上手。 主要特点: 自动管理依赖对象创建 无缝集成 ViewModel 提供作用域管理(Singleton、ActivityScoped等) 简化 Dagger 的复杂配置 核心使用步骤: 添加 Hilt 依赖和注解处理器 使用 @HiltAndroidApp 初始化应用 在 Activity/Fragment 使用
2025-11-08 14:45:28
872
Office2010安装需要的MSXML文件
2018-02-10
Android大屏幕适配demo
2018-02-02
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关注的人
RSS订阅