- 博客(173)
- 资源 (1)
- 收藏
- 关注
原创 android kotlin Flow:distinctUntilChangedBy + stateIn 的坑
自检:distinct 日志/key 已变而 UI 不动 → 查。虽是 getter,lambda 根本没执行。要同步态 → 读变量或快照,别只盯流。晚订阅无首包 → 查。,进界面可能一直没有首包。distinct 按。
2026-05-25 17:00:01
257
原创 Kotlin 协程高级用法之 NonCancellable
无唯一写法不是必须写在finally中,官方从未规定唯一用法两种标准场景官方规范,用于协程全生命周期的资源清理成功分支 + NonCancellable工程实战,用于业务结果的原子提交(你的项目用法)取消后必须用join()等待不可取消代码执行完毕。
2026-05-22 17:16:01
148
原创 RecyclerView 底部留白防悬浮按钮遮挡配置方案
在 RecyclerView 的布局文件中添加 paddingBottom 与 clipToPadding 属性,其中 paddingBottom 设置为适配悬浮按钮的留白高度(如 60dp,可根据实际按钮尺寸调整),clipToPadding 设置为 false,该属性允许列表内容滑动至 padding 区域,确保最后一行图片能够完整滑动展示,不会被悬浮按钮遮挡,此方案适配所有布局管理器,实现简洁且无侵入性,是解决该问题的最优方式。
2026-04-09 15:26:09
53
原创 kotlin flow去重distinctUntilChanged vs distinctUntilChangedBy
灵活性:distinctUntilChanged无自定义空间,distinctUntilChangedBy可自由定义比较Key,适配更多场景。性能:复杂对象/巨型Data Class优先用distinctUntilChangedBy,简单类型用distinctUntilChanged更简洁。兼容性:distinctUntilChanged不兼容可变普通对象,distinctUntilChangedBy可完美适配。
2026-04-04 12:04:42
424
原创 还在用Java单线程池?试试Kotlin协程limitedParallelism!
Java单线程池的轻量化平替最优解,专门解决串行任务的执行需求,同时彻底解决了传统Java线程池资源独占、开销大、易OOM的核心痛点,适配移动端、服务端各类Kotlin项目。拓展使用也极其简单:如果不需要纯串行,想要调整并发数,直接修改括号内的数字即可,比如改为3就是限制3个并发的轻量级线程池,改为5就是5并发,无需改动其他代码,适配不同限流场景的成本极低,灵活度远超Java原生线程池。
2026-03-24 12:23:42
55
原创 Kotlin Mutex vs Java ReentrantLock vs synchronized
(JVM 内置线程锁)、(Java 显式线程锁)、(Kotlin 协程锁),明确三者核心定位、特性差异、选型逻辑与实操规范。纯Java多线程,简单短临界区:选,代码极简,JVM自动管理,无额外心智负担。纯Java多线程,复杂需求(超时、中断、公平锁):选,功能灵活,可控性强。Kotlin协程专属场景:必选Mutex,完全适配协程,保留轻量级核心优势。协程+普通线程混合场景:临界区极短用Mutex+runBlocking;临界区较长直接用ReentrantLock,避免主线程阻塞。
2026-03-19 10:32:10
443
原创 kotlin Flow first() last()总结
以下是first()last()的核心逻辑,其中last函数核心行为(无 predicate)带 predicate 时的行为异常/边界处理first()触发 Flow 收集,拿到发射的第一个元素后立即取消收集(无需等待 block 执行完毕)拿到第一个满足条件的元素后立即取消收集空 Flow/无满足条件的元素 → 抛出与first()逻辑完全一致与first()逻辑完全一致空 Flow/无满足条件的元素 → 返回null(不抛出异常)last()触发 Flow 收集,
2026-03-19 10:17:03
363
原创 RecyclerView ViewHolder的各种position
和数据源严格对应的索引:优先使用(单个 Adapter 内),这是业务开发的核心选择;维度不可混用:数据源维度(binding/absolute)、布局维度(layoutPosition)、动画维度(oldPosition)需按场景区分,避免因维度错误导致数据匹配异常;废弃方法绝对禁用不可使用,仅兼容旧代码,新版优先用细分的 binding/absolute 方法。
2026-03-13 11:36:26
208
原创 IOT设备局域网发现IP调研
IOT设备一、BLE可靠性接近100%二、mDNS 发现成功率降低mDNS = DNS-SD 基于 UDP 组播,发现成功率天生低。Matter 1.0–1.3 标准文档(最权威)DNS-SD(mDNS)在 AP 隔离、跨频段、Mesh 路由下发现成功率显著下降,因此 Matter 强制:配网前发现必须用 BLE,不允许用 mDNS 做主发现出处:Matter 1.3 Spec §4.6 Commissioning Discovery乐鑫 mDNS 官方说明。
2026-03-13 11:08:12
408
1
原创 Flow热流冷流知识梳理
本文深入探讨了Kotlin Flow中冷流与热流的本质区别及其应用场景。冷流(如普通Flow)采用订阅驱动模式,每个订阅者触发独立的上游执行,容易造成性能浪费;热流(如StateFlow、SharedFlow)则采用独立运行模式,所有订阅者共享同一个上游实例。文章通过代码示例验证了两者的核心差异,并指出StateFlow作为特殊的SharedFlow,在状态管理场景中的独特优势。同时强调基础操作符不会改变流的冷热属性,提出通过shareIn/stateIn实现冷流转热流的关键优化方案,推荐使用WhileSu
2026-01-20 18:24:43
651
原创 PictureSelector android的发展和我修改全选功能
如果android12系统不支持的话,会调用到一个稍微难看的文件浏览器的界面,也算能往下兼容(如果是海外GMS框架下,会有兼容的picker支持)。等图片,视频,音频做显示,库内部做了极多的参数配置,极多的Engine提供给开发者去定制比如图片加载器,播放器加载器,还考虑异步加载,快速加载,样式等方方面面。这个时候开始,已经不推荐使用第三方的图库选择框架了。,又简单又轻松,而且重要的是,你的应用压根不需要任何权限。发展壮大,几乎成为了开源图片选择器的唯一选择。Google隐私权限继续加强,做了细分权限。
2026-01-06 22:04:10
431
原创 Android最简化发布模块到mavenCentral
本文介绍了从JitPack迁移到MavenCentral发布Android库的完整流程。详细步骤包括:1)注册Sonatype账号;2)创建命名空间;3)获取用户凭证;4)生成GPG密钥并上传;5)配置Gradle属性文件;6)集成maven-publish插件并配置pom信息;7)执行发布流程。整个过程通过Github插件简化操作,相比JitPack更稳定高效,避免了长时间编译等待的问题。
2026-01-04 14:58:05
610
原创 android kotlinx.serialization用法和封装全解
对于某些字段,我们需要自定义非普通类型,又无法自定义Class,比如系统的Cookie类,UUID类,Color类等,必须自定义解析器后,注解标记。方法一:先编写转换器比如UUIDAsString。然后给需要转化的字段使用@Serializable(with = UUIDAsString::class) //方法一@Contextual //方法二方法二:先编写转换器,如上。然后将它在Json{}申明的时候,注册;字段使用注解标注。
2025-12-21 10:59:45
1272
原创 android NDSDManager onResolveFailed errorCode=3的解决方案
这里采用kotlin的suspendCancellableCoroutine + LinkedBlockingQueue解决。如果你这里直接开始解析,在某些手机上,可能就报错了。告诉你,解析出错,errorCode=3。stack overflow有介绍,这个原因可能是系统同时发现了多个。解决办法:串行执行。
2025-12-18 16:16:38
232
原创 全网首先发现 android NSDManager做mDNS发现可能无反应
Android 在利用NsdManager进行局域网服务发现(如 mDNS)时,可能遇到的因设备兼容性问题导致的失败。为确保应用在绝大多数 Android 设备上稳定运行,强烈建议在使用NsdManager时,主动申请并管理。
2025-12-18 16:08:11
1201
原创 Android12兼容的模糊背景简化版Util类
因为RenderScript或者其他方案,都需要bitmap参与,需要你去对父控件的canvas获取Bitmap。所以,时代已经过去,现在已经是android15-16的天下。我这里提供一个Utils,在android上做模糊背景有推荐4种做法。
2025-12-08 14:44:07
449
原创 36岁程序员的感悟
摘要: 大龄程序员面临技术迭代、时间碎片化和思维固化等挑战,需要调整学习方式:先实践后理解原理,合理规划学习目标。保持开放心态和持续学习尤为重要,同时需警惕思维僵化,将新技术引入实际工作。35岁后需思考职业方向,技术与管理能力兼备是关键。建议主动培养管理思维,勇于承担责任,学会任务拆解和风险控制,灵活调整技术方案并做好迭代规划。
2025-11-16 15:44:17
446
原创 android抽屉DrawerLayout在2025的沉浸式兼容
目前使用View的DrawerLayout+NavigationView实现抽屉似乎已经年久失修。官方已经逐渐转向compose的Drawer。本文暂时没有使用compose。
2025-11-14 15:06:21
1207
原创 2025 android开发搭建windows新电脑添加AI软件和插件
修改背景色:找到"Editor" —> Color Scheme —> General —> Text ----> Default text,点击"Background"所对应的颜色框。10、电脑管家 #CCE8CF RGB(204, 232, 207)1、绿豆沙 #C7EDCC RGB(199, 237, 204)2、银河白 #FFFFFF RGB(255, 255, 255)4、秋叶褐 #FFF2E2 RGB(255, 242, 226)8、极光灰 #EAEAEF RGB(234, 234, 239)
2025-11-13 11:41:59
279
原创 deepseek kotlin flow快生产者和慢消费者解决策略
/ 生产者协程launch {channel.send(i) // 会挂起直到消费者接收// 从 Channel 中消费场景推荐策略理由UI状态更新conflate()只关心最新状态,跳过中间状态用户输入处理debounce()防抖并取消旧请求实时数据监控buffer()sample()缓冲数据并定期采样批量数据处理大容量buffer()提高吞吐量精确控制自定义 Channel 策略完全控制生产消费节奏核心原则:理解业务需求:是需要所有数据还是只需要最新数据?监控性能。
2025-09-27 23:59:32
542
原创 deepseek Kotlin Flow 全面详解
Flow 是 Kotlin 协程库中的异步数据流处理工具,类似于 RxJava 的 Observable,但更简洁、与协程深度集成。// 自定义过滤操作符println("过滤通过: $value")} else {println("过滤拒绝: $value")// 自定义转换操作符emit(sum).collect { println("运行和: $it") }
2025-09-27 23:58:30
975
原创 deepseek Kotlin Channel 详细学习指南
Kotlin协程Channel使用指南 本文全面介绍了Kotlin协程中Channel的基本概念和使用方法。Channel是协程间的通信原语,具有非阻塞、线程安全等特点,支持多种缓冲策略(RENDEZVOUS/UNLIMITED/CONFLATED等)。文章详细讲解了Channel的创建、发送接收操作、生产者-消费者模式实现,以及不同缓冲策略的特性对比和使用场景。同时分析了Channel的内部原理,包括队列结构、挂起机制和缓冲实现。通过示例代码展示了如何在多生产者和消费者场景下使用Channel进行高效安全
2025-09-27 23:57:13
2986
原创 glide4.x/5.x Failed to find GeneratedAppGlideModule
写在定义MyAppGlideModule类中的模块的build.gradle中。但是我却始终没有解决,最后我终于找到了我这里的原因。module-Android: 引入了。
2025-09-21 22:53:17
286
原创 kotlin协程2025 通俗易懂三部曲之下篇 异常处理
本文总结了Kotlin协程异常处理:CoroutineExceptionHandler、try-catch和结构化并发机制。文章详解了不同作用域(coroutineScope/supervisorScope)的异常传播特性:coroutineScope会双向传播异常导致整个作用域失败,而supervisorScope仅单向传播不影响其他子协程。通过多个代码示例展示了try-catch在不同场景下的有效性差异,并指出在多层嵌套协程中异常处理的局限性。特别强调结构化并发中异常会沿Job层次结构传播的特
2025-08-06 14:08:40
1080
原创 kotlin协程2025 通俗易懂三部曲之中篇 常用函数和并发处理
这篇文章是Kotlin协程三部曲的中篇,主要讲解协程的重要函数用法和并发处理。文章介绍了协程函数:runBlocking, withContext, suspendCancellableCoroutine, withTimeoutOrNull/withTimeout, coroutineScope和supervisorScope等。并介绍了如何根据场景使用哪种并发处理。
2025-08-06 12:54:14
873
原创 kotlin协程2025 通俗易懂三部曲之上篇 用法全解
本文是Kotlin协程系列教程的上篇,主要介绍协程的基本用法。内容包括:协程的概念(轻量级线程,基于状态机实现),核心组成要素(CoroutineScope作用域、CoroutineContext上下文、launch/async启动方式),以及最佳实践建议。
2025-08-06 11:46:56
1342
1
原创 Android官方架构指南2025融会贯通
Android架构指南核心思想总结 本文总结Android官方架构指南的核心原则和分层设计思想,强调现代化Android开发应遵循的关键点: 架构原则 关注分离:避免Activity/Fragment臃肿,界面类仅处理UI逻辑 数据驱动:数据独立于UI组件生命周期,确保持久化和离线能力 单一数据源:数据集中管理,通过不可变类型公开 单向数据流:状态向下流动,事件向上传递(UI→ViewModel→Model) 远离Context:ViewModel和数据层不引用Context 分层架构 界面层:View/C
2025-08-04 01:30:48
1266
原创 android MVC/MVP/MVVM/MVI架构发展历程和编写范式
本文对比了MVC,MVP,MVVM,MVI架构在android上的发展历程和实现的代码开发范例。文章指出架构本质是思想而非教条,开发者应重点把握数据驱动、单一数据流等核心原则,而非严格遵循某种模式。随着Jetpack组件的出现,现代Android开发已融合了MVVM和MVI的影子,形成了更灵活的开发范式。
2025-08-01 16:42:19
940
原创 kotlin StateFlow的两个问题和使用场景探讨
本文探讨了在Android开发中使用StateFlow和SharedFlow替代LiveData的实践与问题。文章首先指出日常开发中99%的场景只需单次请求展示,LiveData已足够适用。随后介绍了基于StateFlow的状态管理模板规范,包括状态封装类定义、ViewModel声明和UI层collect操作。重点分析了StateFlow的两个主要问题:1)生命周期变化导致的重复触发;2)数据相同不触发的去重特性。作者通过对比指出SharedFlow更符合替代LiveData的需求,因其无初始值、不自动去重
2025-07-29 16:38:57
1026
7
原创 kotlin Flow快速学习2025
本文介绍了android kotlin Flow的常规使用,常规操作符,StateFlow、SharedFlow等,并对比了Channel,LiveData等。
2025-07-20 20:01:46
1116
原创 android ROOM kotlin官方文档完全学习
使用 Room 将数据保存到本地数据库 | Android Developers (google.cn)1.2 三大组件DataBase,用于保存数据库并作为应用持久性数据底层连接的主要访问点。Entity,用于表示应用的数据库中的表。DAO(数据访问对象),为您的应用提供在数据库中查询、更新、插入和删除数据的方法。1.3 快速示例1.3.1 定义User类定义User数据实体。每个实例代表数据库user表的一行。详细使用参考第二章【使用Room实体定义数据】。用来操控user表的数据
2025-07-18 00:36:16
1388
原创 View的加载过程
上层app通过Surface获取buffer,供上层绘制,绘制过程通过Canvas来完成,底层实现是skia引擎,绘制完成后数据通过Surface被queue进BufferQueue, 然后监听会通知SurfaceFlinger去消费buffer, 接着SurfaceFlinger就acquire数据拿去合成, 合成完成后会将buffer release回BufferQueue。一个window,对应一个Surface,其实在ViewRootImpl里面,app进程中,hardwareRender。
2025-06-06 11:22:17
592
原创 android ViewModel liveData无法监听之多线程下activityViewModels不安全
对于项目中存在的unsafeLazy的,不仅仅是针对viewModel,都建议检查你是否有可能多线程竞争问题;如果,多创建一次对象没啥影响的就无所谓就继续使用。有任何可能,就改成lazy。对于viewModel的初始化,推荐方案1和方案2。不推荐官方的写法。如果用官方写法,请自行把握viewModel的触达,确保最早在主线程中被创建。
2025-05-08 11:20:43
641
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅