- 博客(2101)
- 资源 (15)
- 收藏
- 关注
原创 我写的《高性能Android开发技术》一书已正式出版全国发行
我写的《高性能Android开发技术》一书,已由北京航空航天大学出版社正式出版并全国发行,京东上的发售页面链接地址:https://item.jd.com/12602702.html感谢北京航空航天大学出版社,感谢北京航空航天大学出版社的董宜斌先生、张冀青老师,感谢优快云,感谢给予我帮助和支持的人!谢谢你们!我的邮箱:zhangphil@live.com...
2019-05-11 23:10:56
4468
13
原创 Kotlin新式管道Channel融合flow流,协程实现Android废弃的AsyncTaskLoader(B)
本文介绍了一个基于Kotlin协程实现的Android异步加载框架,用于替代废弃的AsyncTaskLoader。该框架通过Channel和Flow实现数据流传输,包含Loader基类负责后台任务调度,DVModel作为数据模型管理加载状态,LiveData处理数据回调。开发者可通过继承实现具体业务逻辑,如示例中的MyLoader模拟耗时加载任务。测试结果显示框架能正确触发数据变更回调,并在线程池中执行异步加载。该方案充分利用了Kotlin协程特性,为Android异步处理提供了现代化替代方案。
2025-12-29 23:04:44
840
原创 Kotlin管道Channel融合flow流,协程实现Android废弃的AsyncTaskLoader(A)
本文介绍了一种基于Kotlin协程和Flow实现的Android异步加载框架,用于替代已废弃的AsyncTaskLoader。通过Channel管道和Flow流实现数据加载,利用Delegates.observable实现数据变更通知。核心类Loader负责后台任务执行,LiveData实现数据观察模式,DVModel作为ViewModel层协调数据加载与UI更新。测试结果表明该方案能有效实现异步数据加载和自动更新功能,相比AsyncTaskLoader具有更好的协程支持和线程管理能力。该方案充分利用了Ko
2025-12-23 23:11:42
733
原创 Kotlin协程flow缓冲buffer任务流,批次任务中选取优先级最高任务最先运行(二)
本文介绍了使用Kotlin协程Flow实现带缓冲的任务优先级调度机制。通过Channel和buffer构建任务流,生产者持续发送任务,消费者通过collect匀速接收处理。关键点在于:1) 使用buffer缓冲任务流;2) 按优先级排序任务列表;3) 每次选取优先级最高的任务执行。代码展示了完整的任务生产-缓冲-优先级调度-执行流程,包括线程池管理、任务定义和耗时任务模拟。这种模式适用于需要优先处理高优先级任务的场景,如后台任务调度系统。
2025-12-22 23:37:23
979
原创 Kotlin协程await与join挂起函数异同
Kotlin协程中await()和join()函数的区别在于:await()会返回协程执行结果,而join()仅等待协程完成不返回结果。示例代码展示了三个异步任务通过await()等待执行完成后再继续下一步。两者都能实现类似Java中CountDownLatch的同步效果,但await()适用于需要获取返回值的场景,join()则用于只需等待任务完成的场合。
2025-12-21 23:32:00
310
原创 Kotlin协程flow瞬时密集数据流去重debounce(2)
本文介绍了一个基于Kotlin协程Flow实现的通用数据流去重工具类HandlerDelay。该工具类通过debounce操作符实现瞬时密集数据流的去重处理,设置时间间隔为300毫秒。主要功能包括初始化配置、发送数据和关闭通道。内部使用Channel作为数据管道,配合固定线程池处理并发任务。示例代码演示了发送10个随机间隔的数据,最终只输出间隔超过300ms的数据(7和9),验证了去重效果。该工具类封装完整,可直接用于需要处理高频瞬时数据流的场景。
2025-12-20 00:22:54
281
原创 Kotlin协程flow瞬时密集数据流去重debounce(1)
本文展示了使用Kotlin协程Flow处理瞬时密集数据流的去重方案。通过Channel发送20个任务数据,利用debounce操作符设置300ms超时时间过滤高频事件,仅处理间隔超过阈值的有效数据。实现中创建了4线程池处理并发任务,生产者以随机间隔(100-400ms)发送数据,消费者通过debounce过滤后收集处理。日志显示当连续数据间隔小于debounce阈值时会被过滤,最终只处理了符合条件的6、14、17、19等数据,有效解决了高频数据处理的性能问题。
2025-12-19 00:15:09
832
原创 Kotlin协程flow缓冲buffer任务流,批次任务中选取优先级最高任务最先运行(一)
本文展示了如何使用Kotlin协程Flow实现优先级任务调度系统。通过Channel接收源源不断的任务,利用buffer缓冲池存储任务,并按优先级排序处理。主要实现包括:1) 创建固定线程池处理任务;2) 使用Channel接收任务并缓冲;3) 按任务优先级排序后执行最高优先级任务;4) 模拟任务生产和消费过程。代码演示了如何异步接收任务、维护任务列表、排序优先级以及执行耗时任务,适用于需要动态处理优先级任务的场景。
2025-12-18 00:23:44
614
原创 Kotlin超时withTimeout超时与ensureActive()取消协程任务执行
Kotlin协程中withTimeout超时机制失效问题及解决方案 在使用Kotlin协程时,发现withTimeout(4)设置的4ms超时对无限循环任务无效,协程会持续执行而不中断。原因是协程需要主动检查取消状态才能响应超时。通过添加ensureActive()进行活动检测后,协程成功在4ms后中断执行并触发onFailure回调。这表明Kotlin协程的超时机制需要配合主动取消检查才能正常工作,单纯设置超时时间不足以自动中断长时间运行的阻塞操作。
2025-12-12 23:09:32
814
原创 Kotlin协程buffer缓冲池,调度任务执行
本文演示了Kotlin协程中使用buffer操作符实现流缓冲池的功能。通过创建包含10个Req对象的流,设置容量为3的缓冲池,并使用SUSPEND策略处理溢出。代码展示了流处理的完整生命周期,包括onStart、onEach和onCompletion回调。每个Req对象在执行load()方法时会随机延迟,模拟异步任务处理。输出结果清晰显示了缓冲池的工作机制:前5个元素快速发射,但只有3个能立即处理,后续元素按完成顺序逐个处理。这种缓冲机制能有效平衡生产者和消费者的速度差异,提升异步任务处理效率。
2025-12-11 23:04:31
888
原创 Android性能:trace上的锁竞争monitor contention with owner at
Android性能分析中,trace日志出现"monitorcontentionwithownerat"表示存在线程锁竞争问题。该日志显示持有锁的线程ID和执行位置,以及被阻塞线程的等待时间。锁竞争通常由锁持有时间过长、锁粒度过大或线程调度不当引起,会导致主线程阻塞和UI卡顿。优化方案包括:缩小同步块范围、使用细粒度锁、异步处理耗时任务以及调整线程优先级。通过分析锁竞争日志中的Owner线程和等待时间,可以定位性能瓶颈并针对性优化。
2025-12-06 23:58:45
613
原创 Kotlin协程cancel取消正在运行的并行Job
Kotlin协程的cancel()方法不能保证立即停止正在运行的协程任务。示例代码展示了四种取消方式:job1无法被取消会持续运行;job2通过delay()响应取消;job3使用ensureActive()检查取消状态;job4通过isActive主动检测取消状态。与Java线程类似,协程需要内部配合检查取消状态才能真正停止任务。delay()、ensureActive()或isActive检查是实现可靠取消的关键机制。
2025-12-05 23:59:25
245
原创 Android View硬件加速CPU纹理Texture与GPU光栅格化Layer,及属性动画性能
摘要:Android UI绘制通过光栅化将视图对象转换为屏幕像素,GPU硬件加速可优化这一耗时过程。CPU将UI元素转换为多边形和纹理后传递给GPU处理,OpenGL ES API实现数据传递与缓存。硬件加速开启时,Canvas绘制指令被转换为GPU操作(DisplayList),减少重绘范围;关闭时则由CPU完成像素转换。View Layer可缓存绘制结果,提升属性动画性能,但需谨慎使用以避免额外开销。纹理缓存机制复用GPU资源,而复杂组件(如图片、文字)和动画会涉及更多CPU-GPU交互。合理使用硬件加
2025-11-28 23:11:14
955
原创 Android渲染线程Render Thread的RenderNode与DisplayList,引用Bitmap及Open GL纹理上传GPU
Android渲染机制采用CPU与GPU协作方式:CPU负责测量布局等计算工作,GPU负责栅格化渲染。硬件加速通过RenderNode和DisplayList实现,其中每个View被抽象为RenderNode,绘制命令存储在DisplayList中。TextureView直接使用OpenGL纹理提高效率。渲染过程分为构建DisplayList(主线程)和执行渲染(渲染线程),通过共享内存与SurfaceFlinger交互。DisplayList机制优化了性能,避免重复绘制未更新的View。Bitmap纹理上
2025-11-27 23:51:38
942
原创 Android宽高不均等Bitmap缩放为指定宽高FitCenter到正方形Bitmap,Kotlin
本文介绍了两种Kotlin实现将任意宽高比Bitmap缩放为指定大小正方形Bitmap的方法。方案1通过计算中心裁剪区域并缩放实现,方案2(推荐)使用Canvas绘制,通过RectF定义源区域和目标区域实现更精确的fitCenter效果。两种方法都能将图片居中裁剪为最小边长的正方形,然后缩放到目标尺寸(默认400x400)。方案2避免了额外的bitmap创建步骤,性能更优。代码示例展示了如何处理高图和宽图两种不同比例的图片,适用于需要保持图片比例同时适应固定尺寸显示的场景。
2025-11-22 23:08:58
147
原创 Kotlin协程Flow任务流buffer缓冲批量任务,筛选批量中最高优先级任务运行(2)
本文展示了使用Kotlin协程Flow实现带缓冲的批量任务处理。通过将0-51的数字分块(5个一组)生成随机优先级的任务,使用buffer()设置容量为3的缓冲区。在collect阶段对每批任务按优先级排序,执行最高优先级任务。输出显示生产者(onEach)快速生成数据,消费者(collect)逐个处理缓冲区中的批量任务,每次都成功识别并执行当前批次中最高优先级的任务。这种模式适用于需要缓冲处理批量任务并动态选择最优执行顺序的场景。
2025-11-15 23:03:41
901
原创 Kotlin协程Flow流buffer缓冲批量任务或数据,条件筛选任务或数据
摘要: 本文演示了Kotlin协程Flow中buffer缓冲的应用,通过分批处理0-50的数据,设置容量为3的缓冲区并采用SUSPEND溢出策略。代码将数据切分为5个一组,使用onEach模拟生产者生成数据,collect作为消费者处理数据并计算每组的最大最小值。运行结果显示生产者先批量生成3组数据后暂停,消费者处理完缓冲数据后继续生产,实现了生产-消费的节流控制。文章还提供了相关技术博客链接供进一步参考。
2025-11-14 23:11:44
355
原创 Kotlin协程await与join:调度协程优先级及等待线程任务结束
摘要:Kotlin协程中,join()和await()均可用于等待协程完成。join()会挂起当前协程直到指定任务完成,而await()会返回计算结果。代码示例展示了使用join()时高优先级任务先执行(taskHigh延迟1秒),其他任务(taskA/B/C)在join完成后并发执行;使用await()时同样需要等待async任务完成才能继续后续任务。两者都能实现协程间的同步,但await()适用于需要返回值的场景。
2025-11-10 23:04:30
319
原创 Kotlin线程池newFixedThreadPoolContext延迟启动/加载CoroutineStart.LAZY
本文演示了Kotlin协程中使用newFixedThreadPoolContext创建线程池,并结合CoroutineStart.LAZY实现延迟加载。通过创建包含4个线程的线程池,分别启动两个延迟协程任务(LAZY)和一个立即执行任务(ATOMIC)。立即任务执行完成后,手动触发两个延迟任务的启动。代码展示了如何控制协程的执行时机,以及如何通过limitedParallelism限制并发线程数。这种机制适用于需要精细化控制任务执行顺序和线程使用的场景。
2025-11-06 23:12:39
275
原创 Kotlin列表mutableListOf按照某个字段排序sortBy
摘要:本文演示了Kotlin中使用mutableListOf创建可变列表,并通过sortBy方法按照DataBean类的index字段排序。示例代码创建了包含5个元素的列表,使用sortBy{it.index}按索引值排序后输出结果。data class简化了数据类的定义,包含index和data两个属性。输出结果为按1-5排序的索引和对应字母组合。
2025-11-05 23:30:56
163
原创 Android通过SQL查询trace分析进程启动线程总数量
在Perfetto分析工具中,可通过SQL查询统计进程启动的线程总数量。具体步骤:上传trace文件到Perfetto UI,在Query面板输入SQL命令"select tid from thread left join process using(upid) WHERE process.pid=目标进程ID",执行查询即可获取该进程的线程总数。该方法适用于Android性能分析,详情可参考相关技术博客。
2025-11-04 23:09:52
183
原创 Kotlin线程池newFixedThreadPoolContext与约束协程运行的线程数量limitedParallelism
Kotlin协程线程池资源分配示例:通过newFixedThreadPoolContext创建4线程的全局调度器,并使用limitedParallelism实现多级任务优先级调度。高优先级任务(highTask)可使用全部4线程,中优先级(mediumTask)限制为2线程,低优先级(lowTask)仅限1线程。这种机制确保高优先级任务总能获得空闲线程,而低优先级任务只能在剩余资源中运行。代码展示了如何通过控制并发线程数来实现不同优先级的协程任务调度。
2025-11-03 23:48:17
252
原创 Android GPU的RenderThread Texture upload上传Bitmap优化prepareToDraw
Android系统通过RenderThread实现Bitmap到GPU纹理的上传优化。在Android 7.0+中,开发者可通过Bitmap.prepareToDraw()提前异步上传纹理,避免渲染时同步上传导致的卡顿。Android 8.0引入Hardware-Only Bitmap(配置为HARDWARE),其数据仅存于GPU内存,彻底省去上传步骤。系统采用生产者-消费者模型处理图像数据,通过BufferQueue和GraphicBuffer实现高效传输。优化建议包括:提前调用prepareToDraw
2025-10-24 23:50:25
973
原创 HARDWARE 属性的Bitmap与普通Bitmap,GPU与RenderThread渲染与处理方式异同比较,Android
Android中HARDWARE属性的Bitmap与普通Bitmap存在显著差异:HARDWARE Bitmap直接存储在GPU内存中,实现零拷贝渲染、内存优化和直接纹理绑定,特别适用于大量图像显示和频繁更新的场景。相比普通Bitmap需要CPU-GPU内存拷贝,HARDWARE Bitmap能显著提升渲染性能并降低UI线程负载,但仅支持Android 8.0+且部分图像操作可能受限。建议在内存敏感型应用中使用HARDWARE Bitmap,但需注意API兼容性和芯片厂商的实现差异。
2025-10-22 23:30:04
729
原创 android studio设置大内存,提升编译速度
优化Android Studio编译速度可通过调整内存配置实现: 修改AS的VM选项,设置-Xms8g(初始内存8G)和-Xmx12g(最大内存12G); 在idea.properties中添加org.gradle.jvmargs=-Xmx4096m,将Gradle堆内存上限从1.5GB提升至4GB; 修改gradle.properties文件调整Gradle内存配置。 完成设置后需重启Android Studio生效。 参考:Android官方配置指南及优快云技术博客。
2025-10-16 23:10:12
477
原创 Android Coil 3透明渐变crossfade,Kotlin
本文介绍了在Android中使用Coil3库实现图片加载时的透明渐变(crossfade)效果。通过Kotlin代码示例,展示了如何设置从占位图到最终加载图片之间的渐变过渡,并详细说明了相关参数配置。重点包括:使用crossfade()方法启用渐变效果,设置渐变时长(5000毫秒),配置占位图(placeholder)以及处理加载错误的情况。文章还提供了布局文件示例和完整的Activity实现代码,帮助开发者快速实现图片加载时的平滑过渡效果。
2025-09-28 23:10:54
284
原创 Kotlin轻量级互斥锁Mutex与轻量级信号量Semaphore异同比较
Kotlin中的Mutex和Semaphore都是用于并发控制的同步机制,但适用场景不同。Mutex是互斥锁,保证同一时间只有一个线程访问单个资源,适用于保护共享变量或文件等场景。Semaphore是信号量,通过计数器控制对一组资源的访问数量,适用于数据库连接池等资源池管理。Mutex性能更优,但两者都需注意避免死锁。代码示例展示了如何使用withLock和withPermit函数实现同步控制。实际应用中应根据需求选择合适机制,Mutex适合单一资源保护,Semaphore适合控制并发访问数量。
2025-09-27 23:13:34
940
原创 Windows11删除hiberfil.sys大文件
摘要:Windows11启用休眠功能会在C盘生成大文件hiberfil.sys用于保存程序缓存。要删除该文件,需以管理员身份运行命令提示符,输入"powercfg -h off"命令后重启系统即可。该操作可释放C盘空间,但会禁用休眠功能。
2025-09-26 00:00:49
496
原创 git报错:Unlink of file ‘‘ failed. Should I try again? (y/n)
摘要:Git报错"Unlink of file failed"时,输入y/n都无效,通常是因为多个IDE或程序同时访问该文件。解决方法:关闭所有访问该文件的程序后重新执行git命令即可。(49字)
2025-09-24 23:28:57
404
原创 Kotlin互斥锁Mutex协程withLock实现同步
Kotlin中使用Mutex实现协程同步的示例。通过withLock方法确保临界区代码互斥执行,对比了无锁和有锁情况下的并发输出差异。示例展示了三个协程(A、B、C)竞争访问共享资源时,Mutex如何保证线程安全。文章还提供了Java与Kotlin中Semaphore相关技术的参考链接。该方案适用于需要协调多个协程访问共享资源的场景,能有效避免并发冲突。
2025-09-22 23:20:17
517
原创 Android点击桌面图库应用启动流程trace分析
Android点击应用图标启动流程分析:系统通过InputReader从EventHub获取点击事件存入InboundQueue(iq),InputDispatcher将事件包装后放入OutboundQueue(oq)并分发给目标应用。已分发事件存储在WaitQueue(wq),应用进程通过PendingInputEventQueue(aq)接收事件。分析显示,点击事件包含Down和Up动作,启动流程应从AppLaunch_dispatchPtr:Up开始追踪。整个事件分发流程涉及system_server
2025-09-14 23:34:45
476
原创 Android decode time cost BitmapFactory.decodeFileDescriptor / decodeFile vs ImageDecoder,Kotlin
Android图片解码性能对比测试显示,ImageDecoder速度最优,其次是BitmapFactory.decodeFile,最慢是BitmapFactory.decodeFileDescriptor。测试基于高通骁龙8Gen1和展锐平台,结果表明解码速度与芯片架构实现相关。在高通平台上,谷歌官方推荐的ImageDecoder表现最佳,解码时间最短。该测试为Android开发者选择图片解码方案提供了性能参考依据。
2025-09-10 23:05:33
293
原创 Android adb shell命令分析应用内存占用
摘要:本文介绍了使用ADB Shell命令分析Android应用内存占用的多种方法,包括dumpsys meminfo获取具体应用内存信息、top命令监控内存CPU排名(重点关注VSS/RSS指标),并详细解析了top命令的参数用法。此外还涉及卡顿分析相关的内存状态监控、systemtrace抓取方法,以及kswapd0进程对性能的影响。这些命令对Android性能优化和内存问题排查具有实用价值。
2025-09-04 23:16:17
1441
原创 Android把源Bitmap中心缩放到固定宽高的尺寸,Kotlin
该代码实现了一个Android Kotlin函数fitCenterTo,用于将源Bitmap中心缩放到指定尺寸。主要逻辑是:当Bitmap的最大边长超过maxLength时,按比例缩放至maxLength,否则保持原图。适用于需要将图片适配到固定尺寸容器的场景,如方形网格布局。相关技术涉及Bitmap缩放、Canvas绘制和Matrix变换,可参考优快云博客中关于Android图片处理、Material Design布局和Kotlin绘图的更多内容。
2025-09-02 23:08:47
853
原创 Android报错:java.lang.IllegalStateException: Cannot call this method while RecyclerView is computing
Android开发常见问题解决方案:1. RecyclerView报错IllegalStateException的解决方法是在调用notifyDataSetChanged前检查状态,确保RecyclerView不在布局计算或滚动中;2. CardView导入问题可通过参考优快云博客解决,该文详细介绍了导入方法和使用示例。两个问题分别涉及RecyclerView状态管理和第三方库集成,都是Android开发中的典型场景。
2025-08-26 23:10:58
453
原创 Android用Coil 3检查媒体资源是否有效,Kotlin
【Android图片处理技术摘要】1. 使用Coil库检查图片有效性:通过构建1x1像素的低精度请求,执行阻塞式加载并检测bitmap数据,耗时约50ms;2. 性能优化方案:a)自定义Interceptor实现请求耗时监控;b)视频封面缓存改进:JPEG格式压缩使体积减少90%,结合FFmpeg首帧提取和缓冲流技术提升I/O效率。两项技术兼顾功能实现与性能提升,完整方案见优快云博客。
2025-08-25 23:09:51
465
原创 Android Coil 3拦截器Interceptor计算单次请求耗时,Kotlin
【Android Coil3技术分享】文章包含两部分内容:1) 通过自定义Interceptor拦截器实现图片请求耗时统计功能,记录从请求发起至完成的时间差;2) 优化视频封面帧缓存方案,将PNG格式改为JPEG压缩(质量80%),使文件体积减少90%,同时采用FFmpeg快速抽取首帧和缓冲流技术提升磁盘I/O性能。该方案在保持画质的同时显著提升了缓存效率。
2025-08-19 23:31:01
714
原创 Android Coil3视频封面抽取封面帧存Disk缓存,Kotlin(2)
本文介绍了基于Coil3的Android视频封面抽取优化方案,重点改进了磁盘缓存性能。通过将封面帧从PNG无损格式改为JPEG有损压缩(质量80),使缓存文件大小缩减至原先的1/10,显著提升了读写速度。核心实现包括:1)使用FFmpegMediaMetadataRetriever快速抽取视频首帧;2)自定义Bitmap压缩参数(Bitmap.CompressFormat.JPEG);3)采用缓冲流(BufferedOutputStream)处理磁盘缓存写入。该方案在保持图像质量的同时优化了I/O性能,适用
2025-08-18 23:36:45
1167
原创 Android数据缓存目录context.getCacheDir与Environment.getExternalStorageDirectory
Android提供了两种数据缓存目录获取方式:context.getCacheDir()和Environment.getExternalStorageDirectory()。前者位于应用内部,卸载时自动清除;后者位于外部存储,数据会保留。文章还介绍了高版本Android(API29+)获取SD卡目录的新方法,以及使用DiskLruCache实现二级缓存的技术细节。此外,还包含了SD卡文件写入的完整流程说明,涉及权限申请、目录创建和文件操作等关键步骤。
2025-08-14 23:51:01
879
原创 Android实现Glide/Coil样式图/视频加载框架,Kotlin
本文介绍了一种Android实现Glide/Coil样式图片/视频加载框架的Kotlin解决方案。该方案采用二级缓存架构:内存缓存使用LruCache,磁盘缓存基于DiskLruCache实现,最大支持1GB存储空间。通过MD5加密URL生成缓存键,支持同步/异步加载模式,并利用协程处理IO操作。框架包含完整的缓存管理、异常处理和生命周期绑定功能,特别针对视频封面提取场景进行了优化。相比原生实现,该方案在性能测试中显著提升了缩略图加载速度,内存占用减少约30%。相关技术细节可参考作者优快云博客中对FFmp
2025-08-13 23:16:28
1132
MaterialDesignLibrary_Code and Lib合集
2015-09-21
链家2020年9月二手房数据
2020-12-10
strava_com_sample_utf8.xls
2020-12-10
digital-7字体(LED数字样式字体)
2017-09-05
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅