- 博客(48)
- 收藏
- 关注
原创 Kotlin 类委托深入解析:以 MMKV 为例看委托机制在 Android 中的巧妙应用
Kotlin 的类委托是一个非常强大且实用的特性,在实际开发中,可以极大地减少模板代码并增强模块解耦性。MMKV 的巧妙之处在于它实现了两个接口,因此可以通过委托机制替代传统封装。在 Android 项目中,凡是实现了接口的类都可以考虑用委托的方式来简化实现。类委托≠继承,委托的核心优势是灵活和可替换性。希望这篇文章能帮你掌握类委托的核心理念,并能在项目中用好它,写出更优雅、可维护的 Kotlin 代码。如果你对属性委托(如by lazy。
2025-04-05 13:33:52
586
原创 深入理解 Handler、Looper 、 MessageQueue和 HandlerThread
在 Android 中,负责界面绘制和用户交互。如果我们在主线程执行耗时操作(如网络请求、数据库查询、文件读写等),会导致界面卡顿甚至ANR因此,Android 采用让耗时任务放在子线程执行,但子线程那么,👉Handler—— 它可以让不同线程之间安全地通信,并支持消息机制。HandlerMessageLooperLooperHandlerHandlerMessageLooperHandler以下代码展示了Handler。HandlerLooper如果你需要Looper,你不能直接用Thread,因为。
2025-04-03 15:28:41
854
原创 理解Kotlin高阶函数:传递函数,而不是直接执行
Kotlin 高阶函数方式(更简洁)= nulladapter.bindView("Hello") // 模拟点击事件在这里,作为一个高阶函数存储回调,并在里被调用。这种方式比传统接口回调更简洁、灵活。4. 为什么要用高阶函数?高阶函数可以让代码更加灵活,比如我们可以很容易地替换不同的逻辑,而不用修改println(operateOnNumbers(5, 3, subtract)) // 输出 2。
2025-04-03 00:52:43
527
原创 Kotlin 集合函数:map 和 first 的使用场景
Kotlin 提供了丰富的集合操作函数,使开发者可以更加简洁、高效地处理数据。其中,map和first是两个常用的函数,分别用于转换集合和获取集合中的第一个元素。
2025-04-03 00:37:24
195
原创 深入理解 YUV 颜色空间:从原理到 Android 视频渲染
YUV 颜色空间适用于视频压缩,U/V 分量的正确取值对颜色显示至关重要。YUV 转 RGB 需要正确的转换公式,否则可能导致画面偏色(如绿色)。在 Android 开发中,可使用或OpenGL ES进行 YUV 渲染。调试 YUV 渲染时,务必检查 U/V 分量,确保它们不是 0,而是接近128。如果你遇到 Android 设备摄像头输出偏绿色的问题,可以先检查 YUV 数据的 UV 分量,并尝试调整颜色转换公式。
2025-03-31 10:11:05
946
原创 为什么摄像头输出 YUV 而不是 RGB?以及 SurfaceView 如何渲染 YUV?
在 Android 开发中,我们经常需要处理摄像头数据和视频流,而摄像头通常输出的是 YUV 格式的数据,而不是 RGB。为什么会这样?另外,在 UI 层渲染时,SurfaceView、TextureView 和 GLSurfaceView 又是如何处理 YUV 数据的?本文将详细解答这些问题
2025-03-30 15:25:05
561
原创 Java 数组操作:System.arraycopy、Arrays.copyOf 和 Arrays.fill 的区别及为何很少使用
在 Java 开发中,我们经常需要对数组进行复制、扩展或填充操作。和都是 Java 提供的数组操作方法,它们各有用途,但在现代开发中,它们的使用频率却逐渐减少。本文将介绍这些方法的区别,并探讨为何在实际开发中很少使用它们。
2025-03-29 12:59:27
1136
原创 深入理解 Android Intent:Action 与 Category 详解
Action:定义Intent的具体操作,如MAIN(主入口)、VIEW(查看数据)。Category:定义Intent的行为范围,如HOME(桌面)、LAUNCHER(应用列表)。使用场景启动Activity处理系统行为隐式Intent分发源码位置(定义常量)(处理 Intent 分发)这些属性在 Android 应用开发中广泛使用,尤其是涉及Activity 启动、隐式 Intent 处理、广播监听时经常用到。希望本文能帮助你更好地理解Intent机制!
2025-03-28 16:08:35
644
原创 深入理解 Android Intent 机制
Intent是 Android 中用于在组件间传递数据及启动组件的重要机制。常见的Intent显式 Intent:指定目标组件(Activity、Service)隐式 Intent:依靠由系统匹配合适的组件// 显式 Intent// 隐式 Intent隐式 vs. 显式 Intent:隐式Intent需要解析,显式Intent直接指定组件。Intent 解析机制:系统通过查找匹配的。过滤规则actioncategorydata都要匹配。深度链接(Deep Link)
2025-03-28 11:12:14
543
原创 Android Activity 的 launchMode 与 Task Stack 管理
Android 中的决定了Activity在启动时如何在任务栏中管理它的存在方式。下面我们来结合 Task Stack 管理详细解释。
2025-03-28 09:29:26
1027
原创 Android UI 开发中容易被忽略但很有用的属性总结
在 Android 开发过程中,我们经常会使用各种 UI 组件,如 `RecyclerView`、`ScrollView`、`ConstraintLayout` 等。这些组件有很多不太常见但非常有用的属性,能够优化 UI 体验、提升性能或解决一些难以发现的问题。本篇博客整理了一些常被忽略但很有价值的 Android UI 属性,帮助大家更高效地开发和优化界面。
2025-03-25 16:54:27
530
原创 System.arraycopy 在音视频处理中的应用
基本功能用于在数组之间复制元素,效率比for循环手动复制更高,因为它使用了本地方法(native method),通常比 Java 层的循环更快。Object src, // 源数组int srcPos, // 源数组起始索引Object dest, // 目标数组int destPos, // 目标数组起始索引int length // 复制的元素个数是 Java 内置的高效数组复制方法,适用于音视频处理等性能敏感的场景。
2025-03-24 23:28:46
655
原创 深入理解智能家居领域中RS485、Modbus、KNX 和 Zigbee协议概念
在智能家居和楼宇自动化领域,RS485 和 Modbus 常被搭配使用,因为它们分别处于物理层和协议层。而 **KNX** 和 **Zigbee** 则是分别代表了另外两种不同体系的标准或协议,它们的定义和应用范围有所不同
2025-03-24 23:16:43
682
原创 解决安卓so库异常无法打印堆栈的问题
在 Android 6.0 (API 23) 之前,extractNativeLibs 默认为 true;在 Android Gradle Plugin 3.6.0+ 后,该属性默认为 false,需显式设置为 true。这样,so 文件会被解压,崩溃时可以正常打印完整的 native 堆栈。你可以根据实际情况选择适合的方案!
2025-03-24 20:54:43
394
原创 还在手动复制文件?快试试 Android Gradle 自动化任务:实现文件复制
通过 Gradle 自定义任务,我们可以让构建流程更加智能化,减少手动操作的成本
2025-03-21 01:27:41
521
原创 TextView、AppCompatTextView和MaterialTextView该用哪一个?Android UI 组件发展史与演进对照表
在 Android 开发中,UI 组件一直在不断演进,从最初的原生组件,到 Support Library(AppCompat 兼容库),再到如今的 Material Design 组件。这篇文章将梳理 Android UI 组件的发展历史,并提供详细的对照表,帮助开发者选择合适的 UI 组件。:2011 年(Android 3.0 时代)~ 2018 年(Android 9):2014 年(Android 5.0 发布)~ 现在。当然,下面是一张更完整的对照表,列出了。的演进过程,并附带控件的主要功能。
2025-03-20 14:49:02
887
原创 深入理解 RTP、RTCP、RTMP、RTSP、HLS 及 live555 推拉流实现
流媒体技术在音视频传输中起着关键作用,其中 RTP、RTCP、RTMP、RTSP 和 HLS 是最常见的协议。本文将详细介绍它们的区别,并探讨为什么 HLS 逐渐取代 RTMP。此外,还将解析 RTSP 作为控制协议的作用,并讲解 live555 如何实现音视频的推流与拉流
2025-03-13 09:30:43
1039
原创 理解 Retrofit 请求头与 GsonConverterFactory 的自动处理机制
在现代 Web 开发中,特别是在与 RESTful API 进行交互时,我们经常会遇到 JSON 格式的数据交换。为了确保请求的正确解析和响应的准确返回,通常需要通过 HTTP 请求头明确指定请求体的数据类型。而就是用来告诉服务器,当前请求体中的数据格式是。头部的作用是告诉服务器,当前请求体中的数据是 JSON 格式。如果没有明确指定,服务器可能会按默认方式(如text/plain)处理请求体,而导致请求失败或解析错误。服务器依赖头部来决定如何解析请求体的内容。
2025-03-12 21:51:28
864
原创 SIP 协议详解:原理、用途与应用场景
SIP(Session Initiation Protocol,会话初始化协议)是一个**应用层协议**,属于**计算机网络的七层模型(OSI 模型)中的第七层
2025-03-12 15:38:27
1228
原创 UDP学习笔记(三)为什么不需要对方同意就能接收到 UDP 消息?
UDP(User Datagram Protocol)是一种**无连接**的协议,设计上就是**不需要建立连接、不需要对方同意**就可以发送和接收数据。这是 UDP 的特点,也是它在**实时通信、广播、多播**等应用中非常高效的原因
2025-03-09 12:21:44
370
原创 UDP学习笔记(二)为什么UDP接收不需要注册自己的IP
在 UDP 通信中,**接收端不需要指定自己的 IP 地址**,因为 `DatagramSocket` 会监听所有可用的网络接口(即设备上的所有 IP 地址),只要数据包到达这个端口,就能接收到数据
2025-03-08 12:32:13
436
原创 UDP学习笔记(一)为什么UDP需要先将数据转换为字节数组
UDP 发送数据时需要**先将数据转换为字节数组**再发送,主要是因为**计算机网络传输的最基本单位是“字节”**(Byte)。让我们从以下几个方面来深入理解这个设计选择
2025-03-07 16:00:03
610
原创 理解 UDP 协议与实战:Android 使用 UDP 发送和接收消息
UDP(User Datagram Protocol,用户数据报协议)是一个无连接的网络通信协议。与 TCP 不同,UDP 不建立连接,不保证数据的顺序和完整性。它的特点是简单、高效,适用于实时性要求较高、对数据丢失容忍的应用,如音视频传输、DNS 查询等
2025-03-07 10:43:02
942
原创 使用 Kotlin 拆分大文本文件
在实际开发过程中,我们经常会遇到需要处理大文本文件的场景,比如日志文件、小说文本等。当文件过大时,直接打开可能会导致程序卡顿甚至崩溃。为了解决这个问题,我们可以将大文本文件按指定大小拆分成多个小文件,方便处理和查看
2025-03-06 16:21:43
605
原创 Java/Kotlin 开发者如何快速入门 C++
如果你已经掌握了 Java 或 Kotlin,并希望快速入门 C++,你会发现两者有许多相似之处,但 C++ 由于其底层特性(如指针、手动内存管理)而显得更加复杂。本篇博客将对比 Java/Kotlin 与 C++ 之间的关键概念,帮助你更快理解 C++
2025-03-04 12:41:03
913
原创 H.264 编码数据解析:NALU 结构与帧类型
NALU 是 H.264 码流的基本组成部分,每个 NALU 都包含特定的视频数据,如 I 帧、P 帧、B 帧的部分内容
2025-03-04 01:46:59
991
原创 深入理解 Android MediaCodec 视频编码
Android 提供 `MediaCodec` API 用于硬件加速视频编码和解码。相比于 `FFmpeg` 等软件编码器,`MediaCodec` 直接使用设备的硬件编码器,具有 **低功耗、低延迟** 的特点,适用于 **实时视频处理**(如视频通话、直播)
2025-03-02 12:37:04
734
原创 Kotlin 内联函数与block.invoke()的妙用
在 Kotlin 开发中,我们经常使用 `block.invoke()` 来调用函数类型的变量,但你是否知道 `block()` 其实是完全一样的?为什么很多人更习惯 `block.invoke()`?它和 Kotlin 的内联函数 `inline` 又有什么关系?今天,我们就从 `block.invoke()` 讲起,深入解析 Kotlin 内联函数的用法和优点,并探讨 `block.invoke()` 和 `block()` 之间的细节差异
2025-03-01 13:07:11
905
原创 Kotlin使用心得:提升开发效率的实战技巧(二)
这些技巧只是 Kotlin 的冰山一角。根据项目需求和个人喜好,选择性地使用这些功能可以让你的代码更安全、更高效、也更具可读性。每种技巧都有其适用的场景,多尝试、多实践,你会发现 Kotlin 的世界既灵活又强大
2025-03-01 13:06:13
490
原创 Kotlin使用心得:提升开发效率的实战技巧(一)
在 Kotlin 语言下的开发让我深刻感受到它的简洁和高效。从 `val` 的防御性编程,到 `data class` 的简化代码,再到 `sealed class` 和 `Channel` 提升代码的可维护性,Kotlin 让编码变得更加优雅
2025-03-01 02:43:30
325
原创 在 Room 数据库中处理 SQL 通配符:如何避免下划线和百分号的误匹配
简要介绍 SQL 查询中的通配符(`%` 和 `_`),特别是在 Room 数据库中的使用情况,说明它们如何作为通配符进行匹配
2025-02-25 11:47:14
609
原创 Android 开发中线程管理与调试:创建、命名与性能分析
在 Android 开发中,线程管理是一个非常关键的话题。无论是执行耗时的操作,还是确保 UI 更新在主线程上,正确的线程管理都直接影响着应用的性能与稳定性。而在开发过程中,如何查看线程的执行情况、分析线程问题,就显得尤为重要。本文将探讨 Android 中不同的线程创建方式以及如何通过 `Profile` 工具查看它们,最后给出一些实践建议,帮助开发者更好地管理和调试线程
2025-02-20 10:20:22
586
原创 深入了解视频编码:I帧、P帧、B帧和压缩原理
本文将详细讲解视频编码中的**I帧、P帧和B帧**的概念、作用及其压缩效果,并通过实际例子帮助大家理解如何通过不同的编码方式实现视频文件的大小优化。
2025-02-19 12:38:23
856
原创 Kotlin 成员变量详解:var、val、lateinit、by lazy 及 getter/setter
在 Kotlin 中,成员变量(属性)是类的核心组成部分。Kotlin 提供了 `var`、`val`、`lateinit`、`by lazy` 等关键字,以及自定义 `getter` 和 `setter`,帮助开发者更灵活地管理对象的状态。这篇文章将深入介绍这些概念,并给出适用场景和最佳实践。
2025-02-18 14:42:00
551
原创 深入解析 Android ART 垃圾回收日志:如何从 GC 日志获取关键信息
在 Android 开发中,GC(Garbage Collection,垃圾回收)是影响应用性能的重要因素。GC 触发的时间、类型、回收的对象数量、暂停时间等都会影响应用的流畅度和内存管理效率。本文将深入解析 Android ART(Android Runtime)GC 日志的结构、不同类型 GC 的含义,并提供优化建议,帮助开发者更好地理解和优化内存管理。ART 运行时支持多种 GC 机制,不同的 GC 方式有不同的日志输出。掌握这些技巧后,你可以从 GC 日志中更快找出内存优化方向,提高应用的性能!
2025-02-08 14:26:44
617
原创 pjsip学习笔记(二)会话
这个请求是一个SIP INVITE 请求,用于发起与Bob的会话(例如通话)。请求头字段中包含了发起者和接收者的信息、会话的详细描述、路由信息等,而消息体(SDP )包含了音频会话的详细属性,如使用的音频编解码器和通信端口等。
2025-01-23 16:55:32
820
原创 关于使用Service保活的实践(一)
可以发现当返回值为START_STICKY时,即使手动关闭应用亦或shell命令使其关闭,都会使Service不断重启。当返回值为START_NOT_STICKY时,即使手动关闭应用亦或shell命令使其关闭,都不会使Service重启。我们使用startService的方式。
2023-04-20 00:39:02
239
原创 关于Android Studio编译时提示Execution failed for task ‘:xxx:compileDebugJavaWithJavac‘
在项目首次导入编译时,总是会出现一些比较难排除的问题,特别是在提示中无法直接找到原因:* Exception is:org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':bc_iothub:compileDebugJavaWithJavac'. at org.gradle.api.internal.tasks.properties.DefaultTaskProperties.resolve(DefaultTas
2023-04-20 00:36:08
5092
1
原创 检查串口连接外设时遇到的NullPointerException
前不久接到旧项目的维护,其中涉及到了外设连接(平板连接到称重机),需要实时返回数据到平板上显示。问题就在于数据返回的时快时慢,只能一个一个点去排查了。打开AS,连接平板,看看日志,我去这个异常刷都刷不完: ...java.lang.NullPointerException: Attempt to invoke virtual method 'int com.gprinter.io.PortManager.readData(byte[])' on a null object reference
2021-12-29 16:35:44
348
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人