当前位置: 首页 > news >正文

Hvac一次卡顿问题分析

通过查看anr/下的dumptrace日志,搜索空调包名,发现如下日志

"main" prio=5 tid=1 Native | group="main" sCount=1 dsCount=0 flags=1 obj=0x731f9d08 self=0xb4000074f82f5380 | sysTid=2790 nice=0 cgrp=foreground sched=0/0 handle=0x767ee3b4f8 | state=R schedstat=( 43403965835908 128373803042 1427593 ) utm=4024919 stm=315476 core=1 HZ=100 | stack=0x7fe0477000-0x7fe0479000 stackSize=8192KB | held mutexes= native: #00 pc 00000000000126ec /system/lib64/libz.so (inflate_fast+412) native: #01 pc 0000000000010d00 /system/lib64/libz.so (inflate+4628) native: #02 pc 0000000000017b90 /system/lib64/libpng.so (png_process_IDAT_data+132) native: #03 pc 0000000000017968 /system/lib64/libpng.so (png_push_read_IDAT+480) native: #04 pc 0000000000016c60 /system/lib64/libpng.so (png_process_data+124) native: #05 pc 0000000000252fc8 /system/lib64/libhwui.so (SkPngCodec::processData()+344) native: #06 pc 0000000000254118 /system/lib64/libhwui.so (SkPngNormalDecoder::decodeAllRows(void*, unsigned long, int*)+96) native: #07 pc 000000000024acd4 /system/lib64/libhwui.so (SkCodec::getPixels(SkImageInfo const&, void*, unsigned long, SkCodec::Options const*)+336) native: #08 pc 0000000000254e04 /system/lib64/libhwui.so (SkSampledCodec::onGetAndroidPixels(SkImageInfo const&, void*, unsigned long, SkAndroidCodec::AndroidOptions const&)+540) native: #09 pc 0000000000246174 /system/lib64/libhwui.so (SkAndroidCodec::getAndroidPixels(SkImageInfo const&, void*, unsigned long, SkAndroidCodec::AndroidOptions const*)+744) native: #10 pc 00000000001b8508 /system/lib64/libhwui.so (doDecode(_JNIEnv*, std::__1::unique_ptr<SkStreamRewindable, std::__1::default_delete<SkStreamRewindable> >, _jobject*, _jobject*, long, long)+2856) native: #11 pc 00000000001b7828 /system/lib64/libhwui.so (nativeDecodeAsset(_JNIEnv*, _jobject*, long, _jobject*, _jobject*, long, long)+112) at android.graphics.BitmapFactory.nativeDecodeAsset(Native method) at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:762) at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:575) at android.graphics.BitmapFactory.decodeResource(BitmapFactory.java:604) at com.desaysv.svhvac.view.widget.FrameAnimationView.a(SourceFile:174) at com.desaysv.svhvac.view.widget.FrameAnimationView.d(SourceFile:142) at com.desaysv.svhvac.view.widget.FrameAnimationView.a(SourceFile:27) at com.desaysv.svhvac.view.widget.FrameAnimationView$1.handleMessage(SourceFile:109) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:223) at android.app.ActivityThread.main(ActivityThread.java:7705) at java.lang.reflect.Method.invoke(Native method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1001)

这是主线程(main 线程)在做【同步 PNG 图片解码】,把 UI 线程堵死了 → 直接造成卡顿、掉帧、操作延迟!
为什么会卡?
图片解码是耗时、耗 CPU操作
绝对不能在主线程做!
但hvac代码的 FrameAnimationView 偏偏就在主线程解码帧动画 → 不卡才怪。

既然指出具体类,那么直接对此处理就好了

if (getVisibility() == VISIBLE) { // 异步解码 Bitmap,避免阻塞主线程 final int currentIndex = mIndex; mLoadTask = mExecutor.submit(() -> { Bitmap newBitmap = decodeBitmap(mDrawables[currentIndex]); if (newBitmap != null) { post(() -> { // 在 UI 线程更新 Bitmap if (mCurrentBitmap != null && !mCurrentBitmap.isRecycled()) { mCurrentBitmap.recycle(); } mCurrentBitmap = newBitmap; invalidate(); }); } }); }

非预加载模式下,将 decodeBitmap() 移到后台线程执行(使用已有的 mExecutor 线程池)
解码完成后通过 post() 回到 UI 线程更新 mCurrentBitmap 并调用 invalidate()
复用现有的 mLoadTask 来管理任务,可以在切换资源时取消未完成的加载
预加载模式不受影响,因为它已经是在后台线程加载的
这样修改后,主线程只负责调度和绘制,耗时的 Bitmap 解码在后台线程完成,不会再造成卡顿

http://www.jsqmd.com/news/573450/

相关文章:

  • 基于位置闭环的神经网络自抗扰(RBF-ADRC)控制永磁同步电机研究(有推导公式)研究(Simulink仿真实现)
  • 网站URL优化的原则有哪些_如何利用声音搜索优化网站 SEO
  • 基于 hctsa 的脑电(EEG)复杂性核心指标筛选研究
  • 为什么一个视频能让全国人民同时秒开?
  • Mojo主控+Python微服务协同部署(单节点双Runtime热容灾设计):某自动驾驶公司已稳定运行217天的SRE运维白皮书
  • Mixly+MAX30102心率监测实战:从接线到串口数据可视化(附完整代码)
  • Linux下C程序编译与构建系统详解
  • OpenClaw内存优化:千问3.5-9B在4GB设备上的运行方案
  • Ubuntu 24.04 内核 Kernel Panic 问题排查与解决流程(第二次出现该问题后,永久性解决)
  • ai赋能react开发:描述需求即可获得高质量数据可视化组件代码
  • 诗词在线app上线带来的启发和展望
  • 大模型如何“思考”:一文读懂从输入到输出的完整逻辑,小白也能学会收藏!
  • Windows任务栏美化工具TranslucentTB完全指南
  • 用Proteus和Keil C51复刻经典:STC89C51单片机红绿灯仿真全流程(附紧急制动与手动切换)
  • c++编程:多组数据求和
  • APRSPacketLib:嵌入式C库实现APRS协议编解码
  • 谷歌SEO新手入门:以SEO为主、GEO为辅,精准打造高转化内容与用户人群
  • 【51单片机实战指南】从零构建多功能波形发生器:正弦、矩形、三角、锯齿波全解析
  • Tomato-Novel-Downloader:解决小说离线阅读痛点的全场景方案
  • BMP280气压计实战:从硬件接线到数据采集的完整指南(附STM32代码)
  • 【2026年最新600套毕设项目分享】springboot鸣珮乐器销售网站(14301)
  • 希尔排序算法原理与嵌入式应用实践
  • 湖南石材结晶公司
  • OpenClaw+Qwen3-32B内容创作:自动化生成技术博客与配图实践
  • 用AI重新定义中文字体设计:从3000个字符到完整字库的智能飞跃
  • 医疗大数据数据上报失败问题完整排查复盘
  • 混合ai开发新思路:快马生成项目演示云端与d盘本地ollama协同编程
  • 2026年,探秘天水钢筋网片厂家!
  • 【底层重构】C语言100篇:从入门到天花板 第43篇 文件字符读写:fgetc/fputc 与缓冲区机制
  • 腾讯云轻量服务器+宝塔面板:新手零代码搭建个人网站的保姆级避坑指南