记一次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解决完毕。

相关新闻

最新新闻

SerenityOS 命令行选项解析指南:getopt 与 getopt_long 用法、返回值与底层实现

SerenityOS 命令行选项解析指南:getopt 与 getopt_long 用法、返回值与底层实现

SerenityOS 命令行选项解析指南:getopt 与 getopt_long 用法、返回值与底层实现 【免费下载链接】serenity The Serenity Operating System 🐞 项目地址: https://gitcode.com/GitHub_Trending/se/serenity 导读 本文以 getopt(3) 手册 为核心&a…

2026/10/1 19:32:24
轻量服务器还是ECS?大促云服务器选购与避坑实战指南

轻量服务器还是ECS?大促云服务器选购与避坑实战指南

每年大促节点,群里永远有人在问同一个问题:“38元的轻量服务器到底怎么抢?为什么我每次点进去都是已售罄?68元直购和99元的ECS我到底选哪个?”作为一个常年帮团队和自己采购云服务器的老用户,我太清楚这种纠…

2026/9/30 21:32:07
为 AI 代理的 Review 动作编写 Cedar 审批门控策略:review-agent-governance 策略编写实战指南

为 AI 代理的 Review 动作编写 Cedar 审批门控策略:review-agent-governance 策略编写实战指南

为 AI 代理的 Review 动作编写 Cedar 审批门控策略:review-agent-governance 策略编写实战指南 【免费下载链接】agents Multi-harness agentic plugin marketplace for Claude Code, Codex, Cursor, OpenCode, GitHub Copilot, and Google Antigravity 项目地址:…

2026/9/30 19:41:56
PaddleOCR 手写数学公式识别算法 CAN 实战指南:Counting-Aware Network 训练、评估与推理部署

PaddleOCR 手写数学公式识别算法 CAN 实战指南:Counting-Aware Network 训练、评估与推理部署

PaddleOCR 手写数学公式识别算法 CAN 实战指南:Counting-Aware Network 训练、评估与推理部署 【免费下载链接】PaddleOCR Turn any PDF or image document into structured data for your AI. A powerful, lightweight OCR toolkit that bridges the gap between i…

2026/10/1 19:32:23
Spring源码解析:构造器注入的类型转换与候选匹配机制

Spring源码解析:构造器注入的类型转换与候选匹配机制

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 19:32:35
openai-agents-python 多模型接入指南:深入解析 AnyLLMModel 适配层与 any-llm 路由

openai-agents-python 多模型接入指南:深入解析 AnyLLMModel 适配层与 any-llm 路由

openai-agents-python 多模型接入指南:深入解析 AnyLLMModel 适配层与 any-llm 路由 【免费下载链接】openai-agents-python A lightweight, powerful framework for multi-agent workflows 项目地址: https://gitcode.com/GitHub_Trending/op/openai-agents-pyth…

2026/9/30 21:32:11

日新闻

周新闻

月新闻