- 博客(49)
- 收藏
- 关注
原创 工厂模式与多态结合
工厂模式与多态的结合是平台化项目中实现灵活架构的核心技术之一。这种组合能够创建可扩展、易维护的系统架构。多态(Polymorphism)指同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。
2025-06-03 11:25:55
429
原创 系统时间改变对定时器的影响
在 Android 开发中,当系统时间被手动调整到一天前时,不同类型的定时器的行为会有所不同。:会停止执行或延迟触发Timer基于系统时钟时间(如果时间被调回一天前,Timer会认为下一次执行时间还未到达,导致任务延迟触发极端情况下可能造成任务"卡死"(直到系统时间再次超过原定时间)若时间回调一天前,日志输出会暂停,直到系统时间恢复:不受影响(继续按相对时间触发)基于(设备启动后的毫秒数,不受系统时间修改影响)使用(monotonic time),只关心时间间隔即使系统时间被修改,任务仍会每秒触发一次。
2025-05-22 09:25:46
825
原创 Kotlin 协程 (三)
协程通信是协程之间进行数据交换和同步的关键机制。Kotlin 协程提供了多种通信方式,使得协程能够高效、安全地进行交互。以下是对协程通信的详细讲解,包括常见的通信原语、使用场景和示例代码。
2025-05-20 16:32:56
795
原创 Kotlin 协程 (二)
Kotlin 协程提供了丰富的功能,能够高效地处理并发和异步任务。以下是对 Kotlin 协程中常见概念和功能的详细讲解,包括它们的定义、作用、使用场景以及最佳实践。
2025-05-20 11:00:44
903
原创 Kotlin 协程 (一)
挂起函数允许协程在等待任务时挂起,例如。以下通过几个常见场景展示协程的实际用法。协程必须在协程作用域中运行。网络请求与数据库操作。
2025-05-20 10:05:48
664
原创 AtomicReference 和 volatile 的比较
AtomicReference 和 volatile 都是 Java 中用于处理多线程环境下变量可见性和原子性的机制,但它们在功能和使用场景上有重要区别。
2025-05-19 15:36:59
307
原创 kotlin一个函数返回多个值
通过选择合适的多返回值模式,可以显著提升代码的健壮性和可维护性。强制处理所有分支,类型安全。快速实现,无需额外类型。明确字段含义,易扩展。简化代码,提升可读性。
2025-05-07 15:04:02
869
原创 suspendCancellableCoroutine 和 withTimeoutOrNull 的协同工作机制
提供可取消的挂起协程能力,通过注册取消时的清理逻辑。当外部触发取消(如超时、父协程取消)时,自动执行清理并抛出。在指定超时时间(如 2000ms)后,若协程未完成,会发送取消信号。与配合时,能立即终止挂起状态。null。
2025-04-11 15:46:53
233
原创 onUserLeaveHint()
③如果用户点击通知栏消息,导致当前 Activity 失去焦点,③如果系统因内存不足回收 Activity,或屏幕旋转导致重建,(如银行 App 检测到用户按 Home 键,自动模糊界面)④如果当前 App 启动了一个。(但不会销毁 Activity)。(记录用户主动退出的时间点)返回桌面时,系统会调用。(用户主动退出时暂停)
2025-04-08 14:07:05
175
原创 第一行代码 第三版 Kotlin部分笔记(5)
上述代码只是一种示例写法。整个委托属性的工作流程就是这样实现的,现在当我们给MyClass的p属性赋值时,就会调用Delegate类的setValue()方法,当获取MyClass中p属性的值时,就会调用Delegate类的getValue()方法。另外,在默认情况下,所有的泛型都是可以指定成可空类型的,这是因为在不手动指定上界的时候,泛型的上界默认是Any?一个泛型类或者泛型接口中的方法,它的参数列表是接收数据的地方,因此可以称它为in位置,而它的返回值是输出数据的地方,因此可以称它为out 位置。
2025-04-02 17:38:08
590
原创 RxJava2使用例子(数据增删改查)
RxJava2的详细介绍可阅读是 RxJava2 中一个非常重要的操作符,它用于将一个包装成一个Observable(或其他响应式类型,如SingleMaybe:将一段同步代码(通常是耗时操作,如数据库访问、网络请求)包装成响应式流。:自动捕获Callable中抛出的异常,并通过onError传递给订阅者。:只有在被订阅时才会执行Callable中的代码(冷 Observable 特性)。Callable是一个函数式接口,只有一个方法。,当被订阅时会发射的返回值。如果不使用。
2025-03-27 13:55:13
897
原创 RFCOMM
RFCOMM(Radio Frequency Communication Protocol)是蓝牙协议栈中的核心协议之一,用于模拟传统串口通信(RS-232),支持基于流的可靠数据传输。I bt_stack: RFCOMM connection closed, reason=19 # 本地关闭(19=PORT_CLOSED):通过 SDP(Service Discovery Protocol)查询对端设备的 RFCOMM 服务通道号(Channel Number)。
2025-03-25 10:30:36
993
原创 RFCOMM状态通过日志怎么查看分析
1. D bt_rfcomm: PORT_StartInd: handle=5, bd_addr=11:22:33:44:55:66 # 对端请求连接。2. D bt_rfcomm: rfc_mx_sm_state_opening -> rfc_mx_sm_state_configure # 状态切换。D bt_rfcomm: rfc_mx_sm_state_opening -> rfc_mx_sm_state_configure # 状态切换。步骤 3 显示连接成功,但步骤 5 出现缓冲区溢出。
2025-03-25 10:19:37
944
原创 RFCOMM、HFP 和 A2DP
语音带宽较窄(通常 8kHz/16bit,单声道),适合通话。,用于在两个设备之间建立虚拟的串行通信通道(类似有线串口)。是许多蓝牙配置文件(如 HFP、SPP)的底层传输基础。蓝牙耳机与手机的通话控制(HFP 基于 RFCOMM)。,用于将手机的高质量音频(如音乐)传输到耳机/音箱。支持音频编解码(如 SBC、AAC、aptX)。高带宽(44.1kHz/16bit,立体声)。提供简单的流式数据传输(类似 TCP)。蓝牙串口设备(如打印机、传感器)。(与 HFP 的传输层不同)。(但设备可同时支持)。
2025-03-25 10:12:56
460
原创 python处理excel转换成xml文件(翻译文言)
这个声明对于Python 2非常重要,因为在Python 2中,默认的源文件编码是ASCII。DOM(Document Object Model)是一个跨平台和语言独立的接口,它允许程序和脚本动态地访问和更新文档的内容、结构和样式,DOM操作通常涉及构建一个树形结构,然后通过这个结构来读取或修改XML文档的内容。如果你使用的是 Python 3,并且你的系统中同时安装了 Python 2 和 Python 3,可能需要使用。这是DOM树中的根节点,它包含了所有的其他节点。: 代表XML文档中的一个元素。
2024-12-04 14:30:52
1147
原创 Atomic
这个包提供了一系列原子类,这些类用于实现不可变对象和基本操作的原子性。:由于其原子操作,原子类可以安全地在多线程环境中使用,而不需要显式的同步代码。:原子类的操作会自动处理内存可见性问题,确保其他线程能够看到最新的更新值。这些原子类在多线程环境中非常有用,可以简化代码,提高性能,并减少并发问题。)相比,原子类通常更高效,因为它们避免了线程上下文的切换和同步开销。这些操作都是原子的,即它们在执行过程中不会被其他线程中断。:这些原子类提供了一系列原子操作,如增加(是一个 Java 并发库中的包,位于。
2024-08-30 14:08:06
361
原创 查看当前电脑的 User-Agent
User-Agent String.com: 访问 https://www.useragentstring.com/ ,该网站提供了一个工具栏,您可以从中选择不同的浏览器和操作系统,以查看相应的 User-Agent 字符串。UserAgent.API: 访问 https://useragentapi.com/ ,这个网站提供了一个简单的 API,您可以向它发送 HTTP 请求,以获取当前电脑的 User-Agent 信息。您可以通过访问特定的网站来查看当前电脑的 User-Agent。
2024-02-23 09:42:34
3732
原创 CopyOnWriteArrayList
因为每次写操作都会创建一个新的副本,所以写操作会比较慢,并且可能会导致读操作的线程在某个时间段内看到不一致的数据。这是通过在写操作时创建副本来实现的,并且读操作不会被阻塞。适用于读多写少的场景:CopyOnWriteArrayList适用于读多写少的场景,例如在迭代器遍历集合的同时进行修改操作。它的特点是在进行写操作时,会创建一个新的副本,而不是在原有的数据结构上进行修改。内存消耗较高:由于每次写操作都会创建一个新的副本,所以CopyOnWriteArrayList会消耗较高的内存。
2023-09-04 14:38:13
269
原创 context.getContentResolver().query()的使用
当使用SQLite数据库进行查询操作时,可以使用选择条件(selection)和选择条件参数(selectionArgs)来过滤结果。在这个例子中,我们将选择条件设置为"age <=?",选择条件参数为"18",这样就能查询到年龄小于等于18岁的学生信息。假设我们有一个名为"students"的表,其中包含以下列:id、name和age。我们想要查询年龄小于等于18岁的学生。数组来传递,占位符会被数组中的元素替代。在上述代码中,我们使用了。方法的第三个参数是选择条件,其中。方法来执行查询操作。
2023-07-17 10:52:40
932
原创 onScrollStateChanged( )
方法来监听滚动状态的变化,并在状态发生变化时执行相应的操作。例如,你可以在滚动状态为空闲时加载更多数据,或者在滚动状态为拖拽时暂停一些操作。是 RecyclerView 的一个回调方法,用于监听滚动状态的变化。它在 RecyclerView 的滚动状态发生变化时被调用。下面是一个示例代码,演示如何使用。通常情况下,你可以使用。
2023-07-16 13:14:13
1212
原创 LocalDate类
LocalDate是Java 8中的一个日期类,它表示一个不包含时间的日期。它提供了许多方法来处理日期,如获取年、月、日等。LocalDate类是不可变的,因此它的实例是线程安全的。这些方法使得处理日期变得更加简单和方便,可以用于各种日期操作和计算。
2023-07-06 11:00:14
442
原创 子线程运行的任务有返回值
在上面的示例中,我们定义了一个实现了Callable接口的MyTask类,其中的call()方法返回一个随机数。通过调用FutureTask的get()方法,我们可以获取子线程的返回值。子线程可以运行具有返回值的任务。你可以通过实现Callable接口的call()方法来定义任务的逻辑,并在任务完成后返回一个结果。请注意,get()方法是一个阻塞方法,意味着它会一直等待子线程的任务完成并返回结果。因此,在调用get()方法之前,最好确保子线程已经完成了任务,以避免主线程被阻塞。
2023-06-29 10:36:24
300
原创 Headset和PBAP的区别
它允许用户通过蓝牙耳机进行通话和音频播放,同时还支持一些基本的操作,如接听/拒接电话、调整音量等。PBAP是一种蓝牙协议,用于在蓝牙设备之间共享电话簿数据。PBAP协议使用户能够从蓝牙设备中访问和管理他们的联系人,而无需直接使用手机。总的来说,Headset协议主要用于音频传输和通话功能,而PBAP协议主要用于联系人信息的同步和访问。它们是两种不同的蓝牙协议,用于不同的功能和用途。Headset和PBAP(Phone Book Access Profile)是两种蓝牙技术协议,它们有不同的功能和用途。
2023-06-17 12:22:17
542
原创 第一行代码 第三版 Kotlin部分笔记(4)
定义:如果一个函数接收另一个函数作为参数,或者返回值的类型是另一个函数,那么该函数就称为高阶函数。(Kotlin 又增加了一个函数类型的概念)定义一个函数类型:->左边的部分就是用来声明该函数接收什么参数的,多个参数之间使用逗号隔开,如果不接收任何参数,写一对空括号就可以了。而->右边的部分用于声明该函数的返回值是什么类型,如果没有返回值就使用Unit,它大致相当于Java中的void。现在将上述函数类型添加到某个函数的参数声明或者返回值声明上,那么这个函数就是一个高。
2023-06-13 17:43:48
302
转载 Android获取当前系统日期和时间
/取得当前时间的年月日 时分秒。//月份前面加1,是因为从0开始计算,需要加1操作。// 设置Time Zone资料。// 获得当前系统时间。
2023-06-09 14:00:26
5365
原创 检查内存泄漏的方法
把studio生成的hrof文件导出使用hprof-conv.exe转换 ,注意这里不转换Memory Analyzer无法打开。在Androd Studio里运行程序,在Profiler中查看。使用Memory Analyzer打开转换后的文件。
2023-06-09 13:52:39
109
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人