自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(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

原创 HandlerThread 运用

1、初始化一个USB检测的子线程(此线程一直活跃,不用每调用一次方法start一次)2、子线程中运行的逻辑。

2025-03-12 09:19:00 221

原创 日志打印是否为I帧和配置帧

【代码】日志打印是否为I帧和配置帧。

2025-02-10 20:09:00 79

原创 设置Activity为透明主题

【代码】设置Activity为透明主题。

2024-12-26 10:47:28 118

原创 H264解码

【代码】H264解码。

2024-12-13 15:25:37 92

原创 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

原创 车载蓝牙笔记

车载蓝牙

2024-05-28 15:47:22 222

原创 js微博多次拉黑多名用户

【代码】js微博多次拉黑多名用户。

2024-03-21 14:19:39 245

原创 js发微博

【代码】js发微博。

2024-03-21 14:17:39 306 4

原创 js自动多次转发微博

【代码】js自动多次转发微博。

2024-03-18 10:19:34 951 6

原创 js微博评论(F12)

【代码】js微博评论(F12)

2024-03-18 10:17:04 580

原创 同步图片转起来动画

【代码】同步图片转起来动画。

2024-03-13 11:33:56 141

原创 堆栈跟踪中调用的其他方法中修改正在迭代的 Hashtable

方案:Hashtable改为ConcurrentHashMap。

2024-03-06 17:10:40 244

原创 查看当前电脑的 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

原创 判断当前是否有通话

判断当前是否有通话(正常通话和网络通话)

2023-08-18 09:39:39 207

原创 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

原创 保护电话号码隐私

因为有时获取到的电话号码是带空格或“-”的格式。

2023-06-09 14:11:52 154

转载 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

原创 跟随手指冒心动画

https://download.csdn.net/download/qq_46279058/87843828

2023-06-01 14:01:13 59

跟随手指移动的冒心动画

跟随手指移动的冒心

2023-05-30

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除