记一次Android APP卡顿问题的解决历程

发布时间:2026/7/30 1:19:57

记一次Android APP卡顿问题的解决历程
大约在2017年的7、8月份我开发的一款APP突然出现了页面跳转卡顿掉帧然后崩溃的现象我查看日志只看到了一堆掉帧的提示而没有错误点报错提示也非逻辑错误总之就是“我就是卡顿但我就是不告诉你哪卡顿了是谁导致我卡顿了”由于之前没有出现过这个问题于是我开始查找APP卡顿的问题解释然后网友们说的最多的是在主线程里有严重的耗时操作页面刷新频率低于16帧/ms导致了卡顿然后我在每个Activity的每个onCreate( )方法里的语句前后加入了程序运行时间输出语句以此作为推测卡顿区域的工具随后发现一些onCreate( )的执行时间过长超过了16ms而Android系统每隔16ms会发出VSYNC信号重绘我们的界面(Activity)。为什么是16ms, 因为Android设定的刷新率是60FPS(Frame Per Second), 也就是每秒60帧的刷新率, 约合16ms刷新一次。于是我重新深入的学习了Activity的生命周期其生命周期官方版示意图如下所示随后自己总结了生命周期中各个阶段或者方法对应所包括的操作具体如下onCreate表示activity正在创建可以做一些初始化的工作比如加载界面布局资源。onRestart表示activity正在重新启动一般情况下当当前Activity从不可见到可以见的时候该方法会被调用。onStart表示Activity正在被启动activity可见但是没有出现在前台不可以操作。onResume表示activity已经可见了并且出现在前台活动可以做一些储存数据的操作但不能做太耗时操作。onPause表示activity正在停止处于可见但是不可以操作。onStop表示Activity即将停止activity变得不可见可以做稍微重点的回收工作。onDestroy表示Activity即将被销毁我们可以做一些回收工作和资源的最终释放。学习完生命周期后我开始将onCreate(中出了页面绘制以外的代码分散到onStart和onResume中去到这里相信onCreate中的负担已经降到了最轻高高兴兴的重新打包真机实验运行然后从主界面进入功能模块界面--正常然后在模块操作完跳回主界面时啊吘出问题了还是卡顿极其严重的卡顿人生最卡吧万般无奈之下我再次使用了程序运行时间输出无解。。。后来我就开始逐行查看Activity中的代码看呀看看呀看好像有点眉目了在临下班时将问题定位到“首页onResume()函数之后或同时有耗时操作该操作极有可能是照片选择并上传后未关闭的流或者位图缓存或者线程。。。”第二天上班后我在照片选择上传模块进行地毯式搜索发现输入输出流都在使用完毕后进行了也没有多余的线程在额外消耗系统资源在深思了许久之后我出实验室休息了一下转了一圈心情稍稍舒畅了一些后回到了工位对模块功能代码进行再一次梳理在细心地查看下我发现了一个全局变量它贯穿了各个调用选择照片并上传的Activity它的名字叫做“public static ArrayListImageItem tempSelectBitmapnew ArrayListImageItem();// 已选图片列表”是它就是它它彻彻底底的卡顿了我的APP在每次调用照片功能模块的代码后我都对它进行了.clear()操作但是它依旧不消停给人添堵究其原因还是因为其对象实例存在于内存的时间太久真的太久了几乎贯穿了APP所有的运行阶段于是我一狠心一跺脚在onDestroy里加写成了这样if (Bimp.tempSelectBitmap ! null) { try { Bimp.tempSelectBitmap.clear(); Bimp.tempSelectBitmap null;//这句话很重要 } catch (Exception e) { e.printStackTrace(); } }再次运行APP终于流畅了毫无压力的流畅鄙人内心回归平静.....那么接下来咱们总结一下APP卡顿的情况吧1主线程内有严重耗时的操作2有输入输出流、子线程在使用完毕后忘记关闭3Activity的布局层次太深导致界面过度绘制从而引起卡顿4有占用较大内存的全局变量在作祟比如我遇到的这个。开发建议1APP布局设计时尽量减少层级同时在能使用LinearLayout或者RelativityLayout解决的布局就不要用其他复杂繁琐的布局2子线程使用完后一定要及时关闭输入输出流也一样3不用过度使用全局变量如果使用请及时回收有时JVM不能满足实际开发需求。补充一下上次解决卡顿问题虽然成功了但却引起了偶发的ANR随后查看程序日志发现是Bimp.tempSelectBitmap成为了null对象导致引用他的程序语句形成空指针异常于是我又进一步研究了所选照片列表清理办法在另一个类里面找到了答案在那个类里面有一个Bimp.max与Bimp.tempSelectBitmap.size()在每个使用照片选择功能的界面都会进行比较然后进行相应情况下的操作因此在清理所选照片的时候还需要把Bimp.max也清理一下---即Bimp.max0这一语句需要加上而之前的Bimp.tempSelectBitmap null;这句就要拉掉了至此页面卡顿与偶发ANR解决完毕。

相关新闻

开了代理后,VMware虚拟机里的linux忽然连不上,网卡忽然没IP的解决方式:给linux配置静态ip

开了代理后,VMware虚拟机里的linux忽然连不上,网卡忽然没IP的解决方式:给linux配置静态ip

2026/7/30 1:19:57

关于作者:我是星河,一个深耕自己,不内耗的长期主义者。一个对技术充满激情,对工作对生活充满热情的热血青年。坚信,真正能让大家看懂的技术文章才是好文章,坚持用更通俗易懂的大白话写技术博文,…

UVC摄像头

UVC摄像头

2026/7/30 1:19:57

1 版本历史 1.1 UVC uvc_version UVC 1.0: Sep-4-2003 UVC 1.1: Jun-1-2005 UVC 1.5: August-9-2012, H.264 video codec. Linux 4.5 introduces UVC 1.5, but does not support H264.1.2 V4L版本历史 Video4Linux取名的灵感来自1992 Video for Windows(V4W&#xf…

从代码生成到需求交付:一个开发 Skill 的工程化实践

从代码生成到需求交付:一个开发 Skill 的工程化实践

2026/7/30 1:19:57

AI 写代码已经不难了。补全方法、生成接口、修改页面、编写单元测试,主流编程模型都能完成。真正难的是把 AI 放进一个拥有数千个文件、多人协作多年、需求材料分散的真实项目后,它还能不能把一个需求完整交付。最近,腾讯技术团队分享了一套移…

系统编程语言的下一代范式:所有权、借用与代数类型的语言设计趋势

系统编程语言的下一代范式:所有权、借用与代数类型的语言设计趋势

2026/7/30 2:40:01

系统编程语言的下一代范式:所有权、借用与代数类型的语言设计趋势 一、当 segment fault 不再能被容忍时,语言设计必须进化 1972 年,C 语言诞生。内存管理完全交给程序员。后果是:50 年来,缓冲区溢出、use-after-fre…

推理服务的 Serverless 化前景:冷启动、成本模型与开发者体验的三角博弈

推理服务的 Serverless 化前景:冷启动、成本模型与开发者体验的三角博弈

2026/7/30 2:40:01

推理服务的 Serverless 化前景:冷启动、成本模型与开发者体验的三角博弈 一、一个 70B 模型从 0 到 ready 的 45 秒,是 Serverless 的死穴还是可逾越的鸿沟 做过一个实验:在 A100-80G 上冷启动一个 Llama-3-70B 推理服务。从磁盘加载模型权…

白嫖党的生图工具怎么选?2026年免费的AI图片生成工具推荐

白嫖党的生图工具怎么选?2026年免费的AI图片生成工具推荐

2026/7/30 2:40:01

大家好,我是xiao阿娜,一名专注AI工具测评与教程分享的博主。做免费的AI图片生成工具推荐这个话题,大家问得实在太多了。很多用户的需求其实很简单——不是要批量产图、也不是要4K商业大片,就是日常出个社交头像、做个小红书封面图…

2026上海家装甄选参考:从设计、施工、口碑盘点沪上本土实力装修公司

2026上海家装甄选参考:从设计、施工、口碑盘点沪上本土实力装修公司

2026/7/30 2:40:01

随着上海二手房置换、老房翻新需求持续走高,家装市场供需热度稳步上升。不少业主在挑选装修企业时,常常陷入信息繁杂、难以对比的困境。挑选靠谱装修公司,需要结合设计原创能力、施工管控体系、市场业主口碑、企业经营规模、售后保障机制五大…

2026多人会议听记软件横向对比:说话人分离能力实测与选型参考

2026多人会议听记软件横向对比:说话人分离能力实测与选型参考

2026/7/30 2:40:01

一、为什么需要关注“说话人分离” 日常工作中,绝大多数会议录音经过普通转写工具处理后,都会出现同一个问题:所有人的发言内容堆叠在一起,无法区分谁在什么时间说了什么。尤其是4人以上的圆桌讨论、项目评审会、课堂研讨等场景&a…

L2归一化:移除向量尺度信息的技术解析与应用

L2归一化:移除向量尺度信息的技术解析与应用

2026/7/30 2:30:00

1. 为什么需要移除向量尺度信息?在机器学习和数据分析领域,我们经常会遇到需要处理向量数据的情况。这些向量可能代表文本的词嵌入、图像的像素值、用户的特征表示等等。一个常见的问题是:这些向量的绝对大小(尺度)是否…

[具身智能-649]:个人电脑搭建 RTSP 服务完整方案(Windows / Ubuntu 双平台,适配 RDK X5 rtsp2display 调试)

[具身智能-649]:个人电脑搭建 RTSP 服务完整方案(Windows / Ubuntu 双平台,适配 RDK X5 rtsp2display 调试)

2026/7/28 13:30:18

目标:电脑作为RTSP 服务端,循环推送 H264/H265 视频流; RDK X5 通过 rtsp2display 拉流预览,完全不需要在开发板编译 live555。 提供两套成熟方案: ✅ 方案 A:FFmpeg(最简单,优先推…

PDF合并与动态水印的工程化方案:2026国内免费工具实测对比

PDF合并与动态水印的工程化方案:2026国内免费工具实测对比

2026/7/30 1:17:46

一、背景与测试方案 在实际项目交付中,PDF文件合并与版权保护水印的叠加是一个高频但容易被低估的技术需求。典型的处理链路涉及:多源PDF的文件流合并、页面级水印渲染(含透明度混合与图层叠加)、输出文件体积控制。看似简单的操作…

PDF拆分压完图糊了?2026国内免费实测,档案员都在用的组合方案

PDF拆分压完图糊了?2026国内免费实测,档案员都在用的组合方案

2026/7/28 16:04:35

说实话,提到PDF拆分再压缩,我真是被折腾得够呛。 上个月公司年度合同归档,一份300多页的PDF总合同,需要按年份拆分成三个独立文件,再分别压缩到10MB以内方便邮件发送各部门确认。我心想这还不简单?先找个海…

粉笔直播课适合周末集中备考考生突破吗

粉笔直播课适合周末集中备考考生突破吗

2026/7/30 0:09:54

本文面向在职备考、工作日难以抽出整块时间、只能依靠周末集中复习的公考考生,围绕"该平台直播课是否适配周末集中备考节奏、能否支撑瓶颈突破"这一核心问题做客观拆解。文中数据来源于公开财报、官网公示价格、第三方投诉平台公开投诉及用户社区讨论&…

ThreadLocal(存取变量)实战获取当前登录的员工

ThreadLocal(存取变量)实战获取当前登录的员工

2026/7/30 0:09:54

注意AOP所应用的注解以及service方法上自定义的Log注解

INAV飞控配置终极指南:从零到稳定飞行的完整解决方案

INAV飞控配置终极指南:从零到稳定飞行的完整解决方案

2026/7/30 0:09:54

INAV飞控配置终极指南:从零到稳定飞行的完整解决方案 【免费下载链接】inav INAV: Navigation-enabled flight control software 项目地址: https://gitcode.com/gh_mirrors/in/inav INAV飞控配置是每个无人机爱好者必须掌握的核心技能,但很多新手…