- 博客(74)
- 收藏
- 关注
原创 ConcurrentModificationException 并发修改异常详解
ConcurrentModificationException 是 Java 集合框架中用于保护数据一致性的机制,本质是 fail-fast 策略的体现。避免该异常的核心原则是:单线程环境:遍历时使用迭代器的 remove() 方法,或使用 Stream 过滤多线程环境:使用并发安全的集合(如 CopyOnWriteArrayList、ConcurrentHashMap)理解集合的线程安全特性,根据场景选择合适的数据结构掌握这些知识后,能有效避免并发修改异常,写出更健壮的 Java 代码。
2025-06-09 19:42:05
728
原创 Android Kotlin 协程详解
Kotlin 协程是 Android 异步编程的革命性工具,通过轻量级、结构化并发和响应式编程,极大提升了代码的可读性和可维护性。掌握协程的基础、进阶技巧和最佳实践,能够显著提高开发效率,减少内存泄漏和线程管理问题。建议结合官方文档和实际项目不断实践,逐步深入理解协程的核心原理和应用场景。
2025-06-09 19:37:18
1289
原创 Android SharedFlow 详解
在 Android 开发中,响应式编程是一种高效处理异步数据流的方式。Kotlin 协程提供的 SharedFlow 作为热流(Hot Flow)的代表,在事件广播和多订阅者场景中发挥着重要作用。本文将从概念、特性、使用场景及实践等方面全面解析 SharedFlow,帮助大家深入理解并灵活运用这一工具。
2025-06-04 19:48:01
670
原创 Android 中的 DataBinding 详解
DataBinding 是 Android 开发中提升效率和代码质量的重要工具,其核心价值在于通过声明式绑定实现视图与数据的解耦。结合 ViewModel 和 LiveData,DataBinding 能完美支持 MVVM 架构,帮助开发者构建可维护、高性能的应用。尽管存在一些性能和调试上的挑战,但通过合理的代码设计和最佳实践,这些问题均可有效规避。建议在新项目中优先采用 DataBinding,并逐步在现有项目中进行迁移,以充分享受其带来的开发红利。
2025-06-03 21:29:52
1257
原创 Android LiveData 详解
LiveData 作为 Android 架构组件的核心成员,通过生命周期感知和响应式数据分发,显著简化了数据与 UI 的交互逻辑。其与 ViewModel、Room 等组件的无缝集成,以及丰富的扩展能力(如 MediatorLiveData、转换操作符),使其成为构建高效、可维护应用的理想选择。尽管存在一定局限性,但通过合理的架构设计和工具组合,LiveData 能够有效解决传统开发中的痛点,提升开发效率与应用质量。
2025-05-28 20:49:24
1030
2
原创 Android 中的 ViewModel详解
ViewModel 是 Android 开发中管理 UI 数据的核心工具,其生命周期感知能力和数据持久化特性显著提升了应用的稳定性和可维护性。通过结合 LiveData、Room、Retrofit 等组件,开发者可构建高效、可扩展的架构。遵循最佳实践(如避免持有 Context、使用 Repository 模式)能进一步优化代码质量,降低维护成本。无论是简单的计数器应用还是复杂的数据驱动界面,ViewModel 都是实现清晰架构的关键组件。
2025-05-26 21:56:14
1365
1
原创 卡尔曼滤波算法简介与 Kotlin 实现
卡尔曼滤波(Kalman Filter)是一种基于线性系统状态空间模型的最优递归估计算法,由鲁道夫・E・卡尔曼于 1960 年提出。其核心思想是通过融合系统动态模型预测值与传感器观测值,在最小均方误差准则下实现对系统状态的实时最优估计。该算法广泛应用于导航、目标跟踪、信号处理等领域,尤其适合处理带有噪声的动态系统数据融合问题。
2025-05-10 19:27:43
1411
1
原创 Android Service 从 1.0 到 16 的演进史
Android Service 自 1.0 诞生,早期形成基础运行机制。随后不断迭代优化,5.0 引入 JobScheduler 改善任务调度;6.0 起,为保障省电、隐私与性能,持续收紧后台权限,推出 Doze 模式、Scoped Storage 等;8.0 后强制使用前台服务或 JobScheduler 管控后台;10.0 后推荐 WorkManager 替代传统服务;16.0 进一步优化服务管理。整体朝着高效、安全、省电方向演进。
2025-05-06 18:46:14
1389
1
原创 蓝桥杯必考算法解析及真题实战(Kotlin 实现)
蓝桥杯常考算法丰富。搜索算法中,深度优先搜索(DFS)沿路径深入,回溯找解,常用于图遍历、连通性判断 ;广度优先搜索(BFS)逐层扩展,求无权图最短路径拿手 。动态规划将复杂问题拆为子问题,利用重叠子问题与最优子结构特性,通过状态转移方程求解,像背包、最长公共子序列问题都靠它。贪心算法每步做当前最优选择,处理活动安排、哈夫曼编码等问题有效 。分治算法分解大问题为小问题,递归求解后合并,归并排序、快速排序是典型应用 。图算法里,迪杰斯特拉算法、弗洛伊德算法算最短路径,普里姆算法、克鲁斯卡尔算法求最小生成树 。
2025-05-06 18:38:28
596
原创 【解决】superclass access check failed: class butterknife.compiler.ButterKnifeProcessor$RScanner
本文给出了superclass access check failed: class butterknife.compiler.ButterKnifeProcessor$RScanner异常的原因及解决方法,希望能够以对您有所帮助
2025-04-30 19:10:18
490
原创 拥抱 Kotlin Flow
Kotlin Flow 是 Kotlin 协程生态中处理异步数据流的核心工具,它提供了一种声明式、轻量级且与协程深度集成的响应式编程模型。与传统的 RxJava 相比,Flow 更简洁、更易于维护,尤其在 Android 开发中已成为主流选择。本文将从基础概念到高级特性全面解析 Flow,结合实战案例帮助读者深入掌握这一强大工具。
2025-04-30 19:03:41
1224
原创 【解决】编译时出现A problem occurred evaluating initialization script.
本文给出了编译时出现A problem occurred evaluating initialization script.问题的怀疑原因并且给出了实际的解决办法
2025-04-26 09:56:06
231
原创 【解决】trying to draw too large(147456000bytes) bitmap
本文给出了“trying to draw too large(147456000bytes) bitmap”问题出现的原因以及对应的解决方法
2025-04-26 09:47:23
342
原创 Android Build Variants(构建变体)详解
Android 构建变体(Build Variants)是强大且灵活的机制,由构建类型(如 debug、release)和产品风味(如免费版、付费版)组合而成。借助它,开发者能从同一代码库生成多个定制化的 APK 版本。在配置方面,可在 build.gradle 文件中定义构建类型和产品风味,同时能设置不同的属性和资源。通过构建变体,不仅能针对不同应用市场、客户群体、功能特性等定制应用,还能优化应用性能和大小,方便开发和测试。
2025-04-24 22:19:33
1737
2
原创 【解决】Android Gradle Sync 报错 Could not read workspace metadata
针对“Android Gradle Sync 报错 Could not read workspace metadata”问题本文提供了对应的解决方法,可能并不是最优,但至少亲测可解决
2025-04-24 21:26:37
642
原创 【解决】Kotlin代码编译时出现The following declarations have the same JVM signature
本文给出了“Kotlin代码编译时出现The following declarations have the same JVM signature”的解决方法 此问题一般比较常见
2025-04-24 21:21:10
201
原创 基于sherpa-onnx 安卓语音识别尝鲜
Sherpa是一个由 K2-FSA 团队 开发的 开源语音处理框架,旨在解决传统语音识别工具(如 Kaldi)在模型部署和跨平台适配中的复杂性问题。它通过整合现代深度学习技术和高效推理引擎,提供了从语音识别、合成到说话人识别的一站式解决方案,尤其在实时性、低资源消耗和跨平台兼容性方面表现突出。ONNX(Open Neural Network Exchange):即开放神经网络交换格式,是一种用于表示深度学习模型的开放标准文件格式。
2025-04-16 20:03:10
2236
2
原创 Sherpa简介
Sherpa 是一个由 K2-FSA 团队 开发的 开源语音处理框架,旨在解决传统语音识别工具(如 Kaldi)在模型部署和跨平台适配中的复杂性问题。它通过整合现代深度学习技术和高效推理引擎,提供了从语音识别、合成到说话人识别的一站式解决方案,尤其在实时性、低资源消耗和跨平台兼容性方面表现突出
2025-04-16 19:48:31
1004
原创 【解决】Build failed with an exception.Initialization script C:\Users\x\AppData\Local\Temp\ijinit.gradle
Build failed with an exception.Initialization script C:\Users\x\AppData\Local\Temp\ijinit.gradle异常解决方法
2025-03-15 11:02:47
462
原创 Android HandlerThread
HandlerThread 是 Android 中一个非常实用的类,用于创建一个带有消息队列的后台线程,并通过 Handler 机制实现线程间的通信。可以方便地处理消息队列。它的主要目的是在一个单独的线程中处理耗时任务,避免阻塞主线程(UI 线程),从而提高应用的性能和流畅度。
2025-01-24 17:16:34
605
原创 Gson枚举序列化实现
众所周知,Json是无法传递枚举类型的,在对Json处理的过程中,可能大家或多或少都会遇到对于枚举处理的问题,当然解决方式也有很多种,本篇仅针对使用Gson处理Json时对于枚举问题给出一种解决方式,可能并不能适用于小伙伴们实际应用的所有场景,但作为借鉴也算是一个不错的选择。
2025-01-23 20:16:40
1090
原创 UnsupportedClassVersionError解决
java.lang.UnsupportedClassVersionError 错误表明 .class 文件是用较新的 Java 版本编译的,而运行时的 Java 环境版本较低,无法识别该字节码版本
2025-01-22 20:20:10
371
原创 SO库符号冲突
SO库符号冲突是指在链接或运行时,多个动态库(.so 文件)中存在相同名称的全局符号(如函数名、变量名等),导致链接器或运行时无法确定应该使用哪个符号的定义。本文
2025-01-22 20:13:23
634
原创 Flutter 和 Compose Multiplatform对比
Flutter和ComposeMultiplatform跨平台实现的简单选型对,对于有需要的同学可以进行参考,选择哪个框架取决于具体项目需求、团队技术栈和开发者的个人偏好。如果项目需要高性能和丰富的插件生态,Flutter是一个不错的选择。如果项目需要在多个平台上共享UI代码,并且团队熟悉Kotlin,ComposeMultiplatform也是一个很好的选择。
2025-01-19 16:33:20
1215
原创 Jetpack 介绍
Jetpack是一个由多个库组成的套件,可帮助开发者遵循最佳实践、减少样板代码并编写可在各种Android版本和设备中一致运行的代码,让开发者可将精力集中于真正重要的编码工作。
2025-01-19 16:24:39
1050
原创 Android 屏幕采集并编码为H.264
在Android平台上实现屏幕采集并编码为H.264,需要通过MediaProjection API请求用户授权屏幕采集,适配不同安卓版本,使用MediaCodec进行视频硬编码,配置编码参数,并通过链式调用和配置将采集的屏幕数据编码为H.264格式,最后可以将编码后的视频数据推送到RTMP或RTSP服务,用于直播或视频会议等应用场景。
2024-12-06 20:39:08
1685
原创 解决Error resolving plugin xxx
"Error resolving plugin" 通常表示在处理插件相关操作时出现了问题,无法正确解析插件。本文给出了常见场景中一种,希望能够帮到有需要的朋友。
2024-12-04 21:06:11
1040
原创 Android H.264解码实现
Android MediaCodec 是安卓系统中处理音视频编解码的关键组件,其工作流程涵盖配置、数据输入、解码及输出等环节,具备利用硬件加速提升性能、接口统一便于开发等优势,广泛应用于视频播放、音视频编辑、实时通信等场景,但使用时需注意不同安卓版本的兼容性以及做好资源管理,避免出现适配和资源相关问题。
2024-12-04 20:27:21
1408
原创 Android Camera2采集并编码为H.264
Camera2与MediaCodec的结合在Android平台上提供了一种强大的视频处理解决方案。Camera2 API负责高效地从摄像头采集原始视频帧,而MediaCodec API则负责将这些帧实时编码为H.264格式,这是目前最广泛支持的视频编码标准之一。这种组合不仅利用了硬件加速来提高编码性能,减少CPU负担,还确保了视频的高质量输出和良好的兼容性。通过精确控制编码参数,可以根据应用需求调整视频的比特率、帧率和分辨率,实现定制化的视频录制和处理。
2024-11-30 08:43:10
1512
原创 Android 基于Camera2 API进行摄像机图像预览
Android Camera2 API 是从 Android 5.0(Lollipop)开始引入的,用以取代旧的 Camera API。Camera2 提供了更强大和灵活的相机控制能力,允许开发者实现更多的相机功能,如手动对焦、手动曝光、原生 RAW 图像捕获等。该博文是博主近期准备实现摄像机编解码系列中的第一篇、如果对此感兴趣的话,欢迎大家关注或者留言,共同进步。
2024-11-23 10:10:40
1464
原创 CameraWrapper
基于Camera2 API实现的摄像机预览功能封装,主要是对自己的代码片段做一个封装,也给有需要的同学,可以直接拿来用。
2024-11-23 09:55:58
242
原创 LinkedTreeMap cannot be cast to class XXX问题解决
这个异常表面是类型转换错误,但是实际原因是Gson转List时Item类型没转换对,常见于对Gson自行封装的通用json转List时,因为Gson转List时必须指定List的Item类型,如果无法识别就会自动将Item转成LinkedTreeMap。
2024-11-17 17:17:20
868
原创 Jetpack 之 Ink API初探
近期看到谷歌官方推文有一篇关于Jetpack Ink API的文章,随即进行了了解和研究,该SDK主要就是低延时的手写绘制,比如通过手指或者触控笔在安卓设备上面进行笔记记录或者在安卓设备上面进行素描之类类似于纸张上面的操作。当然了可能现在市场上已经存在了此类APP,或者此类的SDK,具体实现方式可能不一,有通过Canvas实现的或者OpenGL实现的,但如果没有系统层面支持的话,一般书写延迟都会相对较高,特别是屏幕越大,越明显,但博主对该SDK书写进行了验证,确实非常丝滑。
2024-11-14 21:31:13
1450
1
原创 主动测量View的宽高
熟知UI显示流程的同学可能都知道,View要获取到尺寸,必须经过测量才能拿到,而测量则是UI显示流程的一个环节,所以按照成正常情况想要获取到View的尺寸,就需要至少等到View显示过程中的测量环节结束才能拿到。但是在开发过程中,可能有一些小众场景,为了显示效果,需要在View显示流程触发之前,对未固定尺寸的View根据内容获取其宽高,进而做其他显示上处理,如果有这样需求的同学,那么通过本篇你将学会如何在View显示流程触发之前获取View的宽高。
2024-11-13 20:08:10
456
原创 解决 Attempt to read from field ‘android.os.MessageQueue android.os.Looper.mQueue‘ on a null object ..
本文阐述了Handler创建时Looper为空的场景,应该很少见,但是如果出现的话,可能也会让人很费解,会让人摸不着头脑,本文给出了常见情况,希望能够给您带来一些帮主。
2024-11-07 21:28:21
490
原创 Android 解决Java和Kotlin JDK编译版本不一致异常
因为java编译使用的JDK版本是1.8,而kotlin使用的版本是17,因此出现了该异常,一般常见于Android Studio版本升级之后默认JDK版本变化导致。
2024-11-07 21:21:41
656
原创 浅谈特朗普上台后对IT行业的影响
想必大家都已经知晓,特朗普在2024年再次上台,本篇文章主要来自网络,如果不惜请勿喷,主要瞎掰下特朗普上台后对IT行业的影响
2024-11-06 19:20:53
441
原创 Android Studio 多工程公用module引用
在项目开发的过程中,有时候一个外部Module可能会被多个工程依赖,如果按照正常的安卓导入Module的方式的话,会将外部Module拷贝到本工程,然后引入,实际上已经与原Module没关系了,这样本身没有什么问题,但是如果想要通过一处修改多处生效的话,可能就需要来回拷贝代码了,这样就会非常的麻烦。那么如果您也有这样需求的话,那么该篇文章肯定会帮到你。
2024-11-05 22:02:10
474
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人