Kotlin
文章平均质量分 87
fundroid
Android GDE(谷歌开发者专家)| 互联网大厂移动端架构师
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
盘点 13 种常见的“协程异常处理”踩坑场景
协程异常处理的核心是结构化并发机制,子协程错误会向上传递影响父协程。本文通过4个典型场景分析Kotlin协程异常处理: launch协程必须在内部捕获异常,外层try-catch无效; async协程的异常会延迟到await时才抛出,需在await处处理; coroutineScope实现"一损俱损",任一子协程失败会取消整个作用域; supervisorScope可隔离失败,但子协程仍需自行捕获异常。 正确处理协程异常对保证程序稳定性至关重要,开发者需要根据业务场景选择合适的处理方式。原创 2025-12-24 08:30:00 · 843 阅读 · 0 评论 -
Kotin Flow 防抖操作符详解(debounce)
文章摘要 防抖(Debounce) 是一种限制数据流频率的操作符,其核心逻辑是:仅在输入值停止出现一段指定时间后,才将最新值传递到下游。它适用于高频触发场景(如用户输入、滚动事件),避免频繁调用下游逻辑。 Kotlin Flow 提供了 debounce 操作符,支持固定超时、基于 Duration 的动态超时,以及根据输入值调整等待时长。例如: 固定超时:debounce(1000) 等待 1 秒静默后发送最新值。 动态超时:通过 Lambda 按输入值类型(如优先级)调整等待时间。 典型应用包括 搜索框原创 2025-12-03 08:15:00 · 1308 阅读 · 0 评论 -
Kotlin 协程避坑指南:GlobalScope vs Application Scope怎么选?
摘要: Kotlin协程中,GlobalScope因脱离生命周期管理易导致内存泄漏、UI异常等问题,而自定义的Application Scope绑定应用生命周期更安全可靠。GlobalScope的缺陷包括:与UI生命周期脱节、进程级存活造成资源浪费、缺乏结构化并发管理、测试困难等。正确做法是在自定义Application类中创建SupervisorJob作用域,通过onTerminate()统一取消协程,确保应用退出时资源释放。Application Scope既能全局调用,又可避免GlobalScope的原创 2025-12-01 08:15:00 · 654 阅读 · 0 评论 -
Kotlin Flow 入门指南:异步数据流的优雅处理
Kotlin Flow 是 Kotlin 协程中的异步数据流处理工具,类似 RxJava 但更轻量。它采用冷流机制,只有调用 collect 时才会执行。Flow 提供丰富的操作符(map、filter、zip 等)进行数据转换和组合,支持异常处理和背压管理。适用于网络请求、UI 状态管理等异步场景,能与协程无缝配合。测试时可使用 Turbine 库验证流行为。Flow 通过操作符链式调用实现声明式编程,简化复杂异步逻辑。原创 2025-09-25 08:30:00 · 978 阅读 · 0 评论 -
Kotlin 2.2 中的嵌套类型别名(Nested Type Aliases)全面指南
Kotlin 2.2引入了嵌套类型别名,允许类型别名限定在类或接口作用域内,提升代码组织性和可读性。类型别名通过简化复杂类型(如lambda、泛型)减少重复代码,便于重构。嵌套类型别名需启用编译器标志,默认可见性为private,可显式设为internal/public。关键限制是不能直接引用外部类的泛型参数,需在别名内重新声明。示例展示了乐器库存服务中嵌套类型别名的实际应用,体现作用域隔离和语义清晰的优势。原创 2025-09-02 08:30:00 · 1013 阅读 · 0 评论 -
把协程里的“并发/异步、阻塞/非阻塞”讲清楚
本文通过Kotlin协程示例清晰区分了"并发/异步"与"阻塞/非阻塞"的概念。作者定义了阻塞型和非阻塞型两种任务函数,通过三个实验展示不同执行方式的效果:顺序执行耗时1400ms(基准);并发执行时,阻塞任务仍耗时1400ms(单线程轮流执行),而非阻塞任务仅需815ms(利用等待时间);当使用线程池调度器时,两种任务都能在800ms左右完成(真正并行)。关键区别在于:阻塞操作占用线程执行时间,非阻塞操作会释放线程资源。通过调试信息可观察到协程在不同调度模式下的线程分原创 2025-08-19 08:30:00 · 1014 阅读 · 0 评论 -
在 SavedState 中使用 Kotlin Serialization
摘要:本文介绍了如何在Android开发中使用Kotlin Serialization处理SavedState,实现UI状态保存与恢复。涵盖Activity中通过saved委托属性简化操作,ViewModel中利用SavedStateHandle保存数据,以及配置Kotlin Serialization多态支持的方法。文章还提到alpha版本已支持nullable类型,但稳定版暂不支持。通过示例代码展示了如何在不同场景下保存和恢复序列化对象。原创 2025-08-12 08:30:00 · 341 阅读 · 0 评论 -
Kotlin 上下文参数(Context Parameters):特性介绍与最佳实践
Kotlin 2.2.0 正式引入上下文参数(Context Parameters)特性,这是对1.6.20实验性功能"上下文接收器"的重大改进。该特性允许函数声明多个命名作用域参数,通过context()语法指定,在需要特定上下文的场景下特别有用。本文通过五个典型应用场景展示了其价值:1)组合多个上下文;2)与协程作用域集成;3)实现轻量级依赖注入;4)创建事务性作用域;5)构建DSL时保持简洁语法。相比实验阶段的上下文接收器,新版本强制命名参数,提高了代码可读性,同时可以通过&quo原创 2025-08-11 08:30:00 · 853 阅读 · 0 评论 -
Kotlin 协程 Flow 取消技术完全指南
Kotlin Flow取消操作指南 摘要:本文详细介绍了5种取消Kotlin Flow的方法,帮助开发者合理管理资源。基础方法是通过Job.cancel()取消协程;结构化并发可通过Scope取消所有子协程;withTimeout和withTimeoutOrNull实现基于时间的自动取消;还可使用布尔标志手动控制Flow发射。文章强调取消操作对资源管理、用户体验和设备续航的重要性,并针对不同场景提供了代码示例,包括如何处理无挂起点的特殊情况。这些方法使开发者能够根据实际需求选择最适合的Flow取消策略。原创 2025-08-06 08:30:00 · 1217 阅读 · 0 评论 -
Android 开发者应避免的 11 个 Kotlin 协程常见错误
Kotlin协程开发中的11个常见错误及最佳实践 本文总结了Android开发中使用Kotlin协程时常见的11个错误及解决方案。主要问题包括:在主线程阻塞、滥用GlobalScope导致内存泄漏、异常处理不当、忽视结构化并发、调度器选择错误、过度使用withContext、未及时取消协程、自定义作用域上下文缺失、async/launch误用、未合理使用Flow处理数据流,以及混淆launch与runBlocking。针对每个问题,文章提供了具体的错误示例和修正方案,强调使用lifecycleScope/v原创 2025-08-05 08:15:00 · 1436 阅读 · 0 评论 -
迁移 Jetpack Compose Navigation 3 实战指南
Jetpack Compose Navigation 3 带来了显著的导航体验升级。本文详细介绍了从传统导航库迁移到 Nav3 的全过程,包括配置依赖、定义页面、迁移NavHost、导航操作及结果处理等关键步骤。Nav3 通过类型安全的 NavKey 接口、简化的状态管理、增强的返回栈控制等改进,大幅提升了导航的可靠性和开发体验。虽然仍处于 alpha 阶段,但其设计理念已展现出未来 Android 导航的发展方向。迁移过程中最突出的优势是编译时安全性、类型化参数传递和更直观的 API 设计,使开发者能够更原创 2025-07-31 08:30:00 · 1728 阅读 · 0 评论 -
Jetpack Compose 导航中的状态管理:跨屏幕数据共享最佳实践
本文深入探讨了Jetpack Compose导航中的状态管理最佳实践。针对常见的状态丢失、参数获取等问题,文章建议:使用ViewModel管理屏幕级状态和业务逻辑;通过SavedStateHandle安全处理导航参数;谨慎使用CompositionLocal共享环境上下文;结合rememberSaveable和rememberNavBackStack保留UI状态;将ViewModel提升至导航图级别实现跨屏幕状态共享。同时提醒开发者避免常见陷阱,如不合理初始化ViewModel、过度使用全局状态等,从而构建原创 2025-07-30 08:30:00 · 899 阅读 · 0 评论 -
inline、crossinline、reified 关键字的那些坑
Kotlin中的inline、crossinline和reified关键字虽能优化性能但需谨慎使用。inline减少函数调用开销但会丢失堆栈信息,建议仅用于小型函数;crossinline可防止lambda在协程中的非局部返回问题;reified解决泛型擦除但必须配合inline使用。实践中应权衡利弊,避免在复杂逻辑或大型函数中使用内联优化,同时注意调试内联代码的特殊技巧。这些特性用好了能提升代码效率,用不好则可能引入难以排查的问题。原创 2025-07-28 09:00:00 · 833 阅读 · 0 评论 -
Kotlin 异常处理新姿势:runCatching 深度解析
Kotlin的runCatching为异常处理提供了函数式风格解决方案。相比传统try-catch,它通过Result类型封装操作结果,支持链式调用map、recover等方法处理成功/失败场景,使代码更简洁流畅。尤其适合需要转换结果或提供回退值的场景,但资源清理仍需配合use函数。虽然runCatching简化了异常处理流程,但在复杂错误处理或性能敏感场景中,传统try-catch可能更合适。开发者应根据具体需求选择异常处理方式,两者各有适用场景。原创 2025-07-15 08:30:00 · 1887 阅读 · 0 评论 -
Swift 适配 Android,Kotlin 该如何应对?
苹果低调成立Swift安卓工作组,计划2025年让Swift原生支持Android开发,意图打破移动开发双端割裂的现状。这一战略将推动Swift从iOS扩展到Android生态,可能重塑开发者技能栈和跨端开发模式。Kotlin面临严峻挑战,但谷歌不会轻易放弃其"亲儿子"语言。这场语言之争将促使双方完善生态,最终受益的是开发者。掌握Swift+Kotlin的复合型人才未来更具竞争力,而跨平台开发也将迎来新的技术范式。原创 2025-07-14 08:30:00 · 1062 阅读 · 0 评论 -
Kotlin 2.4 新语法 Rich Errors:更安全的错误处理新方式
Kotlin 2.4引入Rich Errors革新错误处理方式。该功能通过"|"语法在函数签名中明确返回正常类型和错误类型(如User|NetworkError),将错误处理纳入类型系统。相比传统try-catch方式,Rich Errors具有三大优势:类型安全设计让编译器强制处理所有错误路径;简化冗余的try-catch代码;使错误场景测试更便捷。实战案例显示,它在输入验证、文件操作等场景中能提供更清晰的错误处理逻辑。技术底层基于联合类型实现,需通过配置启用。Rich Errors延原创 2025-07-14 08:30:00 · 1021 阅读 · 0 评论 -
Kotlin 协程:Channel 与 Flow 深度对比及 Channel 使用指南
Kotlin协程中Channel与Flow的对比与应用 Channel和Flow是Kotlin协程处理数据流的两种核心工具,各具特色。Channel适用于点对点通信的实时数据传递,强调生产者-消费者模式,自动处理背压问题。Flow则擅长数据流抽象与转换,支持冷热流和多订阅者场景。 技术选型建议:一对一通信、串行任务和事件驱动优先用Channel;数据流处理、多订阅共享和懒加载场景适合Flow。Channel提供四种构建方式(无缓冲、缓冲、合并和无限制),满足不同需求。 实战案例展示了Channel在安卓开发原创 2025-07-05 21:07:12 · 1566 阅读 · 0 评论 -
WebSocket Android 实战
《Android WebSocket实时通信开发指南》 摘要:本文详细介绍了WebSocket协议在Android移动应用中的实践应用。作为全双工通信协议,WebSocket克服了传统REST API的请求-响应模式局限,适用于聊天软件、实时行情推送、赛事直播、协同编辑等需低延迟、持久连接的场景。文章解析了WebSocket的工作流程(握手、协议升级、通信、终止),并基于OkHttp库给出Android集成方案,包括依赖配置、监听器实现和服务端连接。实战部分展示了实时聊天应用的核心实现,重点介绍了包含自动重原创 2025-07-07 08:15:00 · 1422 阅读 · 0 评论 -
Kotlin 协程取消的原理和最佳实践
Kotlin协程取消机制解析与最佳实践 Kotlin协程通过抛出CancellationException来终止执行,但不当处理会导致"僵尸协程"。常见错误包括:无条件循环(while true)、捕获所有异常吞掉取消信号。解决方案包括:使用isActive检测取消状态、将delay移出try-catch、coroutineContext.ensureActive()显式检查。特别注意Deferred和JUC的CancellationException差异。最佳实践推荐"双重检原创 2025-06-30 08:15:00 · 848 阅读 · 0 评论 -
KotlinConf 2025 发布会亮点速览
本文总结了近期KotlinConf发布的重要新特性:1)基于名称的解构功能,允许通过属性名而非顺序进行解构;2)联合错误类型(Rich Errors),提供了更完善的错误处理机制;3)Kotlin生态整合,将多个常用插件纳入核心发布;4)AI相关功能增强,包括MCP Kotlin SDK和智能体框架Kooga;5)Compose Multiplatform for iOS版本稳定发布;6)协程调试功能改进,提升了开发体验。这些新特性预计将在未来版本中陆续发布,进一步强化Kotlin的开发能力。原创 2025-06-16 09:00:00 · 1053 阅读 · 0 评论 -
Kotlin 避坑:小心数据类中定义的 Lambda 成员
摘要:本文指出Kotlin中data class使用lambda时的一个常见陷阱:由于每个lambda都会创建新对象,即使内容相同也会破坏数据类的相等性。通过将lambda提取为共享引用可解决此问题。文章还引申讨论了Compose框架对lambda的特殊处理机制,使其在重组时能正确比较。该知识点对避免equals()/hashCode()逻辑错误具有重要意义,尤其在缓存和面试场景中需特别注意。(149字)原创 2025-06-14 11:20:17 · 195 阅读 · 0 评论 -
Kotlin Builder 函数:优雅构建结合类
Kotlin标准库提供了一系列便捷函数来简化集合和字符串的构建。buildList、buildSet、buildMap和buildString函数分别对应List、Set、Map和String的创建,它们都采用内联方式实现,避免了lambda开销。对于基本数据类型,还有专门的优化版本如buildIntList、buildFloatSet等。这些构建器函数在内部创建可变集合,执行操作后返回不可变结果,既简化了代码又保持了性能。类似模式也出现在其他Kotlin库中,如Compose和Serialization库原创 2025-06-09 08:30:00 · 606 阅读 · 0 评论 -
活用“状态模式”替代难以维护的 if-else 逻辑
状态模式是一种行为型设计模式,允许对象根据内部状态改变行为,避免繁琐的条件判断。以手机通知模式为例,不同状态(正常、振动、静音)对应不同的来电处理方式。该模式通过将状态逻辑封装到独立类中(如NormalState、VibrateState),使上下文对象(如Phone类)委托行为给当前状态对象,实现状态切换和多态行为。相比if-else语句,状态模式更适用于复杂场景,符合开闭原则,但可能增加类数量。适用于行为依赖状态且状态可能扩展的系统,不推荐简单状态场景使用。原创 2025-06-04 09:00:00 · 1606 阅读 · 0 评论 -
Kotlin 协程初学者容易犯的 5 个错误
Kotlin协程开发中常见5大陷阱:1) View中直接调用挂起函数会导致主线程阻塞和生命周期问题;2) 误用GlobalScope引发内存泄漏和后台任务管理困难;3) 并行执行场景错误地顺序处理导致性能下降;4) 异常捕获不当(特别是CancellationException)造成资源浪费;5) 长时间任务未检查协程状态导致取消失效。正确做法包括:使用viewModelScope管理生命周期、async并行处理任务、区分异常类型以及isActive状态检查。这些最佳实践能显著提升协程代码的可靠性和性能。原创 2025-05-29 08:30:00 · 699 阅读 · 0 评论 -
多 ViewModel 间代码复用最佳实践
为每个 ViewModel 创建一个接口。接口有两个属性,分别是 ViewModel 和 Repository。另外为每个 Action 类型都实现了一个单独的函数,每个函数的功能更具体。类继承:简单,但是有单继承限制辅助类:简单,但缺少重写灵活性。类委托:无法通过this提供 ViewModel 能力。接口默认函数:综合表现最好。特性类继承辅助类类委托接口默认函数可多继承❌✅✅✅可重写性✅❌✅✅VM可访问✅✅❌✅推荐场景。原创 2025-05-04 01:39:44 · 1170 阅读 · 0 评论 -
Kotlin 协程打造内存缓存
很多场景下都会使用到内存缓存。比如官方推荐使用 Repository 模式封装 API 请求,Repository 内部使用数据库搭建本地持久化缓存,减少网络请求的等待。在持久化存存储之外,还可以增加一层内存缓存,这比访问本地数据库还要快的多。内存缓存的类随处可见,比如 Guava,Jetpack 等提供了对应的 Cache 类。本文基于 Kotlin 协程带你一步步实现自己的内存缓存。原创 2025-04-24 08:15:00 · 1139 阅读 · 0 评论 -
ConnectivityManager + Flow 打造 Android 网络状态检测器
Android 应用开发中,经常有需要确保在网络切换或连接丢失时能正确运行。而这个系统服务,是我们管理网络连接的得力助手,配合 Flow 使用实时监听网络状态,保证用户体验的流畅性。原创 2025-04-21 08:15:00 · 919 阅读 · 0 评论 -
Kotlin 协程面试题:使用 Dispachers.IO 要注意什么
在 Review 代码时经常看到这样的写法代码本意是想在把一些非UI任务放到后台,避免阻塞UI。但有时候开发者会忽略任务类型(CPU 密集型 or IO 密集型),滥用 Dispacher.IO 是不合理的。原创 2025-04-15 08:30:00 · 580 阅读 · 0 评论 -
如何正确释放 Closeable 资源:切忌滥用 use 函数
use ()函数确实能保证可关闭资源正常关闭,但它没解决资源初始化的问题,也没法保证资源肯定是在use ()代码块里用的。这就得开发者自己注意这些关键步骤,就很容易出岔子,导致资源泄漏。每个Closeable资源的手动实例化都可能导致资源泄漏。我们可以封装自定义作用域函数来减少错误写法的可能。如下作用域函数的概念大家应该知道了(例如等),简单说定义一个参数为 lambda 的函数,提供一个面相某context 的作用域// ...// ...// ...// ...以上这些写法理论上都可行。原创 2025-04-08 08:30:00 · 567 阅读 · 0 评论 -
2025 跨平台技术如何选:KMP 与 Flutter 的核心差异
跨平台技术的选择本质是组织能力的映射。KMP 像一位精通多国语言的外交官,在原生生态中游刃有余;Flutter 则像一位才华横溢的画家,用统一的笔触描绘多平台画卷。2025 年的今天,随着 Compose Multiplatform 的成熟和 Flutter 3.0 的性能突破,这场竞赛已不再是零和游戏——聪明的团队正在混合架构中寻找最优解,让每一行代码都在正确的位置发光。原创 2025-04-07 08:15:00 · 4334 阅读 · 0 评论 -
一文看懂 Jetpack Compose 布局流程
本文用通俗易懂的语言介绍 Jetpack Compose 的布局流程,涉及到 MeasurePolicy,Modifier,Constraints, Intrinsic measurement 等概念。原创 2024-12-09 08:00:00 · 1718 阅读 · 0 评论 -
一文看懂 Compose 强制跳过模式(Strong Skipping Mode)
强制跳过模式(Strong Skipping Mode)是一个小更新,但是其实影响深远,它有点像从“性本恶”到“性本善”的转变,认为不稳定类型的危害是可忽略的,当然它的开启会引入正确性风险,这也是为什么它经过了长期的实验验证后,才正式引入。经过实验和开发者反馈,证明它的引入是收到欢迎的。只要大家遵循好的编码习惯,不随意滥用不稳定性类型,鼓励打开强跳模式,会让 App 性能得到一个整体提升。原创 2024-10-09 08:30:00 · 1400 阅读 · 0 评论 -
Jetpack Compose 1.5 发布:全新 Modifier 系统助力性能提升
Jetpack Compose 1.5 发布,性能终于得到大幅提升,这得益于全新的 Modifier 实现方式原创 2023-09-11 08:30:00 · 2476 阅读 · 6 评论 -
Kotlin 1.9 新特性预览:data object (数据单例)
data object 数据单例是 Kotlin 1.9 中预定引入的新特性 ,但其实从 1.7.20 开始就可以预览了。接下来让我们看看它有哪些特点。原创 2023-07-04 08:30:00 · 3068 阅读 · 0 评论 -
深入浅出 Compose Compiler(1) Kotlin Compiler & KCP
Compose 的语法简洁、代码效率非常高,这主要得益于 Compose Compiler 的一系列编译期魔法,帮开发者生成了很多样板代码。但编译期插桩也阻碍了我们对于 Compose 运行原理的认知,想要真正读懂 Compose 就必须先了解它的 Compiler。本系列文章将带大家揭开 Compose Compiler 的神秘面纱。Compose 是一个 Kotlin Only 框架,所以 Compose Compiler 的本质是一个 KCP(Kotlin Compiler Plugin)。原创 2023-04-29 12:00:54 · 2413 阅读 · 4 评论 -
终于懂了~ 图解 SharedFlow 缓存系统
图解 MutableSharedFlow 的 replay ,extraBufferCapacity,onBufferOverflow 等参数,深入理解 SharedFlow 的缓存系统原创 2022-10-07 10:00:00 · 4305 阅读 · 0 评论 -
面试题:聊聊 Kotlin 代理的“缺陷”以及如何应对
Kotlin 代理是面试中经常被问到的问题,比如介绍一下代理的实现原理以及在使用中的一些注意事项等,本文将带你梳理这些问题,让你从更高的维度上认识“代理”Kotlin 有很多让人津津乐道的语法,“代理”就是经常被提及的一个。Kotlin 在语言级别通过 by 关键字支持了代理模式的实现。代理模式是最常用的设计模式之一,它是使用“组合”替代“继承”的最佳实践。下面取自 Wiki 中关于代理模式的例子:class Rectangle(val width: Int, val height: Int) {.原创 2022-05-02 09:30:00 · 627 阅读 · 2 评论 -
Jetpack MVVM 七宗罪之六: ViewModel 的接口暴露不合理
在 Jetpack 架构规范中, ViewModel 与 View 之间应该遵循单向数据流的通信方式,Events 永远从 View 流向 VM ,而 State 从 VM 流向 View。如果 ViewModel 对 View 暴露了不适当的接口类型,则会破坏单向数据流的形成。不适当的接口类型常见于以下两点:暴露 Mutable 状态暴露 Suspend 方法暴露 Mutable 状态ViewModel 对外暴露的数据状态,无论是 LiveData 或是 StateFlow 都应该使用 I原创 2022-03-16 02:37:20 · 4148 阅读 · 2 评论 -
巧用 @JvmName 解决 Kotlin 函数签名冲突
Kotlin(JVM) 中定义下面这样两个方函数时,编译器会报错fun foo(value: List<String>) {}fun foo(value: List<Int>) {}Platform declaration clash: The following declarations have the same JVM signature (method(Ljava/util/List;)V):因为 Java 的泛型编译期擦除,所以 JVM 无法识别签名中泛型的区原创 2022-03-11 19:27:45 · 7033 阅读 · 0 评论 -
像 Compose 那样写代码 :Kotlin DSL 原理与实战
1. 前言Kotlin 是一门对 DSL 友好的语言,它的许多语法特性有助于 DSL 的打造,提升特定场景下代码的可读性和安全性。本文将带你了解 Kotlin DSL 的一般实现步骤,以及如何通过 @DslMarker , Context Receivers 等特性提升 DSL 的易用性。2. 什么是 DSL?DSL 全称是 Domain Specific Language,即领域特定语言。顾名思义 DSL 是用来专门解决某一特定问题的语言,比如我们常见的 SQL 或者正则表达式等,DSL 没有原创 2022-02-28 09:00:00 · 5695 阅读 · 12 评论
分享