自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(28)
  • 收藏
  • 关注

原创 [协程]-[详解]-[协程作用域]-lifecycleScope

可以发现, lifecycleScope 通过CAS自旋保证多线程下的单例构建, 并预设协程上下文为 SupervisorJob() + Dispatchers.Main.immediate, 既保证子协程崩溃不影响父协程, 也保证了任务能最快速执行, 最后再通过执行 LifecycleCoroutineScopeImpl.register() 向 Lifecycle 注册生命周期监听, 保证能在 Lifecycle 销毁时取消协程.又是怎么感应 LifecycleOwner 的 destroyed?

2026-03-12 22:52:27 159

原创 [协程]-[详解]-[协程作用域]-viewModelScope

摘要:viewModelScope是ViewModel的扩展属性,本质是CloseableCoroutineScope对象,实现了自动取消机制。它通过synchronized锁安全构建,并将作用域存入ViewModel的mBagOfTags集合中。当ViewModel执行clear()时,会遍历该集合并调用Closeable对象的close()方法,从而取消关联的协程作用域。这种机制确保了协程在ViewModel销毁时自动取消,避免了内存泄漏问题。与LifecycleScope不同,viewModelSco

2026-03-12 22:51:59 235

原创 [协程]-[详解]-launch与async

Kotlin协程中launch和async的核心机制解析:两者都继承自AbstractCoroutine,通过newCoroutineContext合并上下文(参数上下文>父上下文>默认调度器),并使用attachChild实现父子协程绑定。关键区别在于:launch返回Job用于无结果任务,异常立即传播;async返回Deferred用于有结果任务,异常在await时抛出.

2026-03-12 22:49:08 399

原创 [协程]-[详解]-[上下文]-CoroutineExceptionHandler

摘要:Kotlin协程通过CoroutineExceptionHandler处理运行时异常,需在根协程中定义。协程代码经编译脱糖为invokeSuspend方法,由BaseContinuationImpl.resumeWith调用并用try-catch包裹。异常通过协程层级传递至根协程,最终由自定义CoroutineExceptionHandler或JVM处理。默认情况下,子协程异常由父协程的处理器处理,根协程未定义则导致应用崩溃。

2026-03-11 11:22:57 143

原创 [协程]-[详解]-[上下文]-[Job]-SupervisorJob

除了官方提供的supervisor协程作用域, 我们也可以自己自定义// 定义异常处理器 (不自定义, App依旧会崩溃)Log.e("xiaoma", "捕获到未处理异常: ${throwable.message}")// 自定义作用域:SupervisorJob 是核心// 任务异常不会影响 supervisorScope 启动的其他任务throw RuntimeException("网络请求失败") // 模拟崩溃println("兄弟, 你崩吧, 我活的很好!")

2026-03-11 11:06:09 167

原创 [协程]-[详解]-[上下文]-[Job]

Job 是协程的句柄。使用 launch 或 async 创建的每个协程都会返回一个 Job 实例,该实例是相应协程的唯一标识并管理其生命周期。val job = scope.launch { // 启动一个协程// 协程任务块if (...) job.cancel() // 取消协程核心职责状态查询: 查看协程是在运行、已取消还是已完成生命周期控制: 手动取消协程或等待协程执行完毕层级维护: 建立父子协程的关系。

2026-03-11 10:49:10 439

原创 [协程]-框架拆解

本文摘要: Kotlin协程框架解析主要介绍了suspend函数、协程作用域和协程上下文三大核心概念。suspend函数通过状态机实现非阻塞执行,但需注意避免滥用;协程作用域包括GlobalScope、lifecycleScope、viewModelScope等,各有适用场景和生命周期管理方式;自定义作用域需合理选择Job和调度器。协程上下文通过"+"运算符组合调度器、异常处理器等元素,遵循继承规则。文章还分析了DEFAULT、LAZY等四种启动模式的特点及适用场景,为开发者正确使用协程

2026-03-11 10:23:13 379

原创 [协程]-简单入门

Kotlin协程是一种轻量级并发机制,具有非阻塞式挂起和结构化并发特性。它通过挂起函数、协程作用域、上下文等框架实现线程间高效切换。在UI开发中,可使用lifecycleScope.launch创建协程,通过withContext切换线程执行耗时操作,最后自动返回主线程。这种同步代码风格的异步实现方式比回调嵌套更优雅,且能自动管理生命周期,避免内存泄漏。

2026-03-11 09:54:44 40

原创 Android触摸事件-深度剖析

Android事件分发机制详解:从硬件层到应用层的完整流程。事件分发主要包括硬件输入、Native层处理、Java层分发三个阶段。在Java层,事件通过dispatchTouchEvent、onInterceptTouchEvent和onTouchEvent三个核心方法协作完成分发。硬件层事件通过InputDispatcher跨进程传递到应用进程,DOWN事件快速直达,MOVE事件采用批处理+VSYNC机制解决采样率与刷新率不匹配问题。ViewGroup通过mFirstTouchTarget记录消费DOWN

2026-01-24 00:18:54 536

原创 Handler的深度剖析

Android的Handler机制是线程间通信的核心,通过Looper、MessageQueue和Handler协同工作实现消息传递。关键点包括:1)子线程需按序执行Looper.prepare()、创建Handler和Looper.loop();2)主线程Looper由系统自动初始化;3)消息按when时间排序存入队列,Looper循环处理;4)支持同步屏障和异步消息实现UI绘制优先处理;5)Message对象池化优化性能(最大50个)。HandlerThread简化了子线程使用流程,而主线程Looper

2026-01-24 00:06:46 563

原创 ANR的深层剖析

从Native到Java, 深度剖析ANR

2026-01-23 23:56:20 736

原创 [安卓-Android]-服务端字段混淆

解决安卓马甲包,服务端字段容易被GooglePlay检测出的问题

2025-06-11 12:04:27 637

原创 ConcurrentModifcationException 的 what、why、how

ConcurrentModifcationException、Fast-Fail、快速失败检查机制、List并发操作

2024-04-03 10:43:23 1897

原创 Apk瘦身脚本 - 图片批量压缩

Apk初级瘦身神器 - 图片批量压缩脚本

2024-04-01 17:54:44 341

原创 为什么匿名内部类会持有外部类对象?

发现了吗,java编译器构建了一个名为Outer$1的类去实现、继承匿名内部类对应的类,并构建了一个有参构造器,入参规则是:外部类对象 + 匿名内部类使用到的外部类中的成员变量(上面用到了外部类的字符串,构造的有参构造器就会增加这个String的参数)答案是延时任务对象是通过匿名内部类构建的,其拥有外部类对象,这就让Activity退出后,GC释放不了Activity对象所占用的内存块,引发内存泄漏。可以看到,我们在构建Inner对象时,是通过无参构造器构建的,不会将外部类对象传入静态内部类的情况。

2024-02-23 18:25:50 1692

原创 Handler 泄漏场景、解决方案、深入理解

摘要: Handler在Android开发中容易引发内存泄漏,特别是通过postDelayed()发布延时任务时。当Activity退出后,若延时任务未执行完毕,匿名内部类会持有Activity引用,导致Activity无法被GC回收。原因是Handler任务会被存入主线程Looper的MessageQueue中,而主线程Looper是静态对象(GC Root),形成引用链:Looper.sMainLooper → MessageQueue → Message → Runnable → Activity。解

2024-02-23 12:30:02 2030

原创 Android GestureDetector支持View拖动、长按拖动

Android 简单实现View拖动、View长按拖动

2024-02-22 19:12:40 1048

原创 ViewModel 唯一性原理解析、生命周期管理解析

ViewModel横竖屏切换、ViewModel生命周期

2023-03-24 12:39:02 1537

原创 使用Ijkplayer播放flv资源

github上jcenter引用方式失效,转而使用阿里镜像依赖

2025-06-13 18:29:02 365

原创 Mac安装jd-gui 保姆级 含问题处理

JAVA_HOME全部成: /Users/makele/workspace/github/jdk1.8.0_451.jdk/Contents/Home。下载jd-gui-osx-1.6.6.tar即可,下载后放到对应位置,解压。解决办法是下载Jdk 1.8 ,让jd-gui使用该版本。两种安装方式都有各自的坑,废话少说,咱们开始吧。即可,下载后找个好点的地方解压,不需要dmg的。解压后,开始让jd-gui使用这个版本。保存,点击打开jd-gui,大功告成!右键应用jd-gui如下。第二种:下载代码安装。

2025-06-13 16:32:35 1185

原创 [Adb]-操作命令大全

用于在计算机(Windows、macOS、Linux)和连接的 Android 设备(手机、平板、电视、模拟器等)之间建立通信桥梁。它允许开发者直接与设备交互,执行各种调试、管理、文件传输等操作。是 Android 开发工具包(SDK)中一个功能强大的。

2025-06-11 18:43:06 425

原创 Kotlin $字符怎么实现字符串拼接

Java中一个String就是一个对象,通过➕拼接会重新构建一个String对象,所以尽量避免在循环中进行String拼接,那怎么进行拼接呢?StringBuilder拼接时不会构建新String对象,平时一般使用StringBuilder进行拼接即可。了解完Java中的String相关,那Kotlin中一般怎么进行字符串拼接的呢?看一下,我们拼上都用$进行字符串拼接,那Kotlin内部怎么实现的?Java 8下,使用的是StringBuilder拼接。Java17下,使用的String拼接。

2025-05-14 11:30:21 426

原创 Apk瘦身脚本 - 无用代码剔除

【代码】Apk瘦身脚本 -

2024-04-03 10:44:53 213

原创 Apk瘦身脚本 - res资源可用性检查

在一些大一点的项目,Lint在执行之后会Run很长时间,且只是给你找出问题点。在瘦身时可能存在一定量的res需要剔除,用Lint检查起来就会相对慢一些,且有些Code删除之后我们也需要重新检查其是否有引用哪些layout、drawable等,这些也是可以一并检查删除的。Lint可以帮我们检索项目中可能存在错误的地方,平时功能代码写完后,也建议大家用其检查一下代码,帮助我们提高代码的健壮性。下面是脚本代码,实现起来相对简单暴力,直接放在Android项目下运行即可。

2024-04-01 18:12:19 295

原创 Android 不同XML相同ID名怎么输出到Apk中

哇唔

2023-08-02 12:13:34 334

原创 Android APK瘦身

Apk瘦身-初级

2023-08-02 10:44:50 132

原创 Android Lifecycle 使用、原理解析

Lifecycle使用及原理

2023-03-28 18:11:57 824

原创 Java设计模式 - 适配器模式

适配器模式

2023-03-28 11:24:21 248

空空如也

空空如也

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

TA关注的人

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