Android官方开发文档Training系列课程中文版:如何避免ANR?

原文地址:http://android.xsoftlab.net/training/articles/perf-anr.html#anr

尽管你写代码可能通过了世界上所有的性能测试,但是它还是可能会让人感觉到卡顿。当应用卡的不成样子时,系统会给你弹一个”Application Not Responding”的对话框。

在Android中,系统会对那些长时间没有响应的应用采取一些措施:弹出一个对话框告诉用户APP已经停止了响应,如下图所示:

正出于这个原因,系统会在APP长时间没有响应的时候为用户提供一个退出APP的选项。所以使APP能够及时响应这一点是至关重要的,这样系统才不会向用户显示ANR对话框。

这节课我们会学习Android系统如何检测应用程序是否是未响应,以及应用程序如何保持响应能力的一些改进措施。

什么触发了ANR?

通常情况下,系统会在应用程序不再能够响应用户的输入时显示ANR对话框。比如,如果应用阻塞在了UI线程的IO操作上,那么系统就不能够处理用户的输入事件。或者应用花费了大量的时间在内存模型的构建上或者是在UI线程中计算了游戏的下一步动作。要记住:
即便是最高效的代码也需要花费时间来运行。

任何情况下都不要在UI线程中执行耗时操作,而是要将这些工作放在一个单独的线程中执行。这可以使UI线程保持流畅工作(UI线程负责驱动用户界面的事件循环)。

在Android中,应用程序的响应态由Activity Manager及Window Manager负责监控。系统会在侦测到以下状况时显示ANR对话框:

  • 对输入事件在5秒内没有作出响应。
  • BroadcastReceiver在10秒内没有执行完毕。

如何避免ANR?

Android应用程序默认运行在UI线程中。这意味着在UI线程中的任何耗时操作都会引发ANR问题,因为这会使应用程序给不到输入事件或者意图广播处理的机会。

因此,在UI线程中的每个方法都应当做尽可能少的工作,尤其是Activity的生命周期回调函数。像网络或数据库操作,或者大量的计算之类的耗时操作应当在工作线程中执行。

创建用于执行耗时操作的线程最便捷的方式莫过于使用AsyncTask了。只需要继承AsyncTask,然后重写doInBackground()就可以执行了。如果要向用户展示工作进度,你可以使用publishProgress()方法,它会回调onProgressUpdate()方法(该方法运行于UI线程)。
在onProgressUpdate()内我们可以更新进度条。

private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {// Do the long-running work in hereprotected Long doInBackground(URL... urls) {int count = urls.length;long totalSize = 0;for (int i = 0; i < count; i++) {totalSize += Downloader.downloadFile(urls[i]);publishProgress((int) ((i / (float) count) * 100));// Escape early if cancel() is calledif (isCancelled()) break;}return totalSize;}// This is called each time you call publishProgress()protected void onProgressUpdate(Integer... progress) {setProgressPercent(progress[0]);}// This is called when doInBackground() is finishedprotected void onPostExecute(Long result) {showNotification("Downloaded " + result + " bytes");}
}

使用execute()方法启动工作线程:

new DownloadFilesTask().execute(url1, url2, url3);

如果不采用这种方式,我们还有另一种实现方法:创建自己的Thread或HandlerThread。如果采用这种方法,那么应该设置该线程的优先级为”background”:通过Process.setThreadPriority()方法及参数THREAD_PRIORITY_BACKGROUND设置。
如果没有设置该优先级,那么该线程会使应用感到变慢,因为该线程的优先级默认与UI线程的优先级一致,它们会互相抢占CPU资源。

如果实现了自己的Thread或HandlerThread,那么要确保在等待其它工作线程完成之前UI线程不被阻塞—不要调用Thread.wait()或Thread.sleep()。如果需要等待其它线程的执行结果,可以为UI线程创建一个Handler。这样做可以使UI线程还可以对
输入事件保持响应能力。这样就可以避免5秒内无响应的ANR对话框出现。

BroadcastReceiver在执行时间上有特殊的限制,这意味着在其内部的工作一定是轻量级的:比如在后台做一些保存设置或者发送通知的工作。所以与UI线程中执行的方法一样,广播接收器内也应当杜绝耗时操作的出现。

TIP: 你可以使用StrictMode来发现UI线程中意外出现的耗时操作。

ANR相关优化

一般来说,100~200毫秒是用户所能感知到应用卡顿的极限。下面列出了一些可以避免应用程序ANR的一些点,同样也有助于防止出现卡顿的情况:

  • 如果应用需要对用户输入做大量的后台工作,可以显示一个进度表示工作正在进行。
  • 对于游戏类的复杂计算,应该将这些工作放在工作线程中执行。
  • 如果应用在初始化阶段需要花费一些时间,可以考虑显示一个闪屏页面或者尽可能快的显示主界面:展示加载正在进行,并进行异步数据填充。在这些情况下都应当表明任务正在进行,以免让用户认为应用已经卡死。
  • 使用Systrace或Traceview等性能工具检查APP的响应瓶颈。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/478790.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

预训练语言模型真的是世界模型?

文 | 子龙自GPT、BERT问世以来&#xff0c;预训练语言模型在NLP领域大放异彩&#xff0c;刷新了无数榜单&#xff0c;成为当前学界业界的心头爱&#xff0c;其主体结构——Transformer——也在逐步的运用于其他领域的任务中&#xff0c;常见的如与CV的跨界&#xff0c;也有相对…

monk js_对象检测-使用Monk AI进行文档布局分析

原文链接&#xff1a;https://blog.csdn.net/weixin_26752075/article/details/108494230 monk js 计算机视觉 (Computer Vision) 介绍 (Introduction) This is an article on how Object Detection can help us in predicting various regions of a document. It can be usefu…

LeetCode 2019 力扣杯全国秋季编程大赛

文章目录1. 比赛结果2. 题目解析2.1 猜数字 Easy2.2 分式化简 Esay2.3 机器人大冒险 Medium2.4 覆盖 Hard2.5 发 LeetCoin Hard1. 比赛结果 2019.9.24晚&#xff0c;第一次参加线上比赛 比赛排名结果&#xff1a;582/1541&#xff0c;做出了2道题。。。 我证明了&#xff1a;…

美团广告实时索引的设计与实现

背景 在线广告是互联网行业常见的商业变现方式。从工程角度看&#xff0c;广告索引的结构和实现方式直接决定了整个系统的服务性能。本文以美团的搜索广告系统为蓝本&#xff0c;与读者一起探讨广告系统的工程奥秘。 领域问题 广告索引需具备以下基本特性&#xff1a; 层次化的…

论文浅尝 - AAAI2020 | 多通道反向词典模型

论文笔记整理&#xff1a;朱珈徵&#xff0c;天津大学硕士&#xff0c;自然语言处理方向。链接&#xff1a;https://arxiv.org/pdf/1912.08441.pdf动机反向词典将一段描述作为输入&#xff0c;并一起输出与该描述匹配的其他词&#xff0c;具有重要实用价值和自然语言处理研究价…

拒绝暴力调参!推荐一个模型Debug神器!

近些年深度学习在视觉、自然语言处理、语音等各个技术方向都诞生了不少创新应用&#xff0c;如智能识别医疗图像中的病灶&#xff0c;辅助医生做病情诊断&#xff1b;智能判别生产线上有质量问题的产品&#xff0c;减轻人工质检压力&#xff1b;对政务、金融等流程中的证件票据…

论文浅尝 - IJCAI2020 | Mucko:基于事实的多层跨模态知识推理视觉问答

论文笔记整理&#xff1a;陈卓&#xff0c;浙江大学计算机科学与技术系&#xff0c;博士研究生。论文链接&#xff1a;https://arxiv.org/pdf/2006.09073代码&#xff1a;https://github.com/astro-zihao/mucko发表会议&#xff1a;IJCAI 2020任务定义及背景VQA&#xff08;视觉…

LeetCode 40. 组合总和 II(排列组合 回溯)

1. 题目 给定一个数组 candidates 和一个目标数 target &#xff0c;找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的每个数字在每个组合中只能使用一次。 说明&#xff1a; 所有数字&#xff08;包括目标数&#xff09;都是正整数。 解集不能包含重…

质量运营在智能支付业务测试中的初步实践

背景 毋庸置疑&#xff0c;质量是决定产品能否成功、企业能否持续发展的关键因素之一。对于“质量时代”下的互联网企业&#xff0c;如何在快速迭代的节奏中兼顾质量&#xff0c;真正落地“人人重视质量、人人创造质量、人人享受质量”&#xff0c;这是对QA的要求&#xff0c;也…

新手手册:Pytorch分布式训练

文 | 花花机器学习算法与自然语言处理单位 | SenseTime 算法研究员目录0X01 分布式并行训练概述0X02 Pytorch分布式数据并行0X03 手把手渐进式实战A. 单机单卡B. 单机多卡DPC. 多机多卡DDPD. Launch / Slurm 调度方式0X04 完整框架 Distribuuuu0X05 Reference文中所有教学代码和…

Hotel booking酒店预订——数据分析与建模

Hotel booking酒店预订——数据分析与建模&#xff1a;https://zhuanlan.zhihu.com/p/196757364?utm_sourcewechat_session 写文章Hotel booking酒店预订——数据分析与建模&#xff08;转载翻译自kaggle&#xff09;海上泊舟数据分析师数据源&#xff1a;https://www.science…

论文浅尝 - ICLR2020 | Pretrained Encyclopedia: 弱监督知识预训练语言模型

论文笔记整理&#xff1a;陈想&#xff0c;浙江大学博士&#xff0c;研究方向为自然语言处理&#xff0c;知识图谱。Wenhan Xiong, Jingfei Du, William Yang Wang, Veselin Stoyanov.Pretrained Encyclopedia: Weakly Supervised Knowledge-Pretrained Language Model来源&…

LeetCode 216. 组合总和 III(排列组合 回溯)

1. 题目 找出所有相加之和为 n 的 k 个数的组合。组合中只允许含有 1 - 9 的正整数&#xff0c;并且每种组合中不存在重复的数字。 说明&#xff1a; 所有数字都是正整数。 解集不能包含重复的组合。 示例 1: 输入: k 3, n 7 输出: [[1,2,4]]示例 2: 输入: k 3, n 9 输出…

“小众”之美——Ruby在QA自动化中的应用

前言 关于测试领域的自动化&#xff0c;已有很多的文章做过介绍&#xff0c;“黑科技”也比比皆是&#xff0c;如通过Java字节码技术实现接口的录制&#xff0c;Fiddler录制内容转Python脚本&#xff0c;App中的插桩调试等&#xff0c;可见角度不同&#xff0c;对最佳实践的理解…

软考中级 软件设计师资料(考点分析+复习笔记+历年真题+电子版课本)

软考中级 软件设计师资料&#xff08;考点分析复习笔记历年真题电子版课本&#xff09;&#xff1a; https://blog.csdn.net/weixin_44754772/article/details/113763165 软件设计师是软考中级职称&#xff0c;相比高级的难度而言&#xff0c;中级难度较低&#xff0c;每个人花…

关于NLP相关技术全部在这里:预训练模型、图神经网络、模型压缩、知识图谱、信息抽取、序列模型、深度学习、语法分析、文本处理...

神器推荐NLP近几年非常火&#xff0c;且发展特别快。像BERT、GPT-3、图神经网络、知识图谱等技术应运而生。我们正处在信息爆炸的时代、面对每天铺天盖地的网络资源和论文、很多时候我们面临的问题并不是缺资源&#xff0c;而是找准资源并高效学习。但很多时候你会发现&#xf…

LeetCode 77. 组合(回溯)

1. 题目 给定两个整数 n 和 k&#xff0c;返回 1 … n 中所有可能的 k 个数的组合。 示例:输入: n 4, k 2 输出: [[2,4],[3,4],[2,3],[1,2],[1,3],[1,4], ]来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;https://leetcode-cn.com/problems/combin…

论文浅尝 - AAAI2020 | 从异质外部知识库中进行基于图的推理实现常识知识问答...

会议&#xff1a;AAAI2020论文链接&#xff1a;https://arxiv.org/pdf/1909.05311.pdf摘要常识问答旨在回答需要背景知识的问题&#xff0c;而背景知识并未在问题中明确表达。关键的挑战是如何从外部知识中获取证据并根据证据做出预测。最近的研究要么从昂贵的人类注释中生成证…

插件化、热补丁中绕不开的Proguard的坑

文章主体部分已经发表于《程序员》杂志2018年2月期&#xff0c;内容略有改动。 ProGuard简介 ProGuard是2002年由比利时程序员Eric Lafortune发布的一款优秀的开源代码优化、混淆工具&#xff0c;适用于Java和Android应用&#xff0c;目标是让程序更小&#xff0c;运行更快&…

互联网高端社畜行话大全(表情包)

作者 | 洋气的圆圆君前几天&#xff0c;字节跳动CEO张一鸣发表的演讲刷屏朋友圈&#xff0c;其中不忘开讽互联网黑话。燃鹅&#xff0c;作为一只卑微的互联网社畜&#xff0c;哪天被父母问起来我们行业常说的“抓手”、“赋能”都是啥&#xff0c;答不好的话那是要被challenge自…