如何理解在主线程进行读写操作而导致ANR?

刚看了一篇优秀博文,讲了导致ANR的原因之一是CPU满负荷,可能是因为在主线程频繁的文件读写。我想问的问题是为什么在子线程执行文件读写就不会CPU满负荷?难道主线程执行的占用时间比子线程长?

0

5个回答

简单来说,就是导致anr的原因是失去响应,而不是cpu负载
放在ui线程,会导致界面阻塞,失去响应
放在子线程里,ui线程本身不操作,还能响应,因此就不会失去响应
但是放在ui线程还是子线程,cpu的占用是一样的,不存在放在子线程就不消耗cpu了
最后,你看的文章是错的。不要抱着那个错误的文章纠结了。“优秀博文”并不代表文章就不是错的,那个只是编辑根据访问量推荐出来的。

4

你看到的文章的作者概念不清,anr = Application Not Responding,翻译成中文叫做应用失去响应,注意是没有响应,而不是cpu满载。
也就是说,界面线程不能响应用户的操作了,卡死了。
先不论读写文件会不会造成cpu满负荷(实际上不会),子线程造成造成cpu满负荷,但是只要界面线程还能处理用户响应,那么就不会导致anr
而主线程如果正在做同步的操作,而阻塞了用户操作,哪怕没有cpu满负荷,也会造成anr,因此主线程要避免长时间处理同步的代码,这才是问题的关键。

0
caozhy
贵阳挖掘机马善福,自备车辆专业挖游泳池 回复m0_37164176: 不存在,如果你相同的操作放在主线程会导致cpu满负荷,那么放在子线程也一样。
一年多之前 回复
m0_37164176
Go_head 我试过在主线程进行大量读写操作,导致cpu满负荷了,而把读写操作放在子线程,就不会满负荷。这是为什么呢?
一年多之前 回复

那么导致ANR的根本原因是什么呢?简单的总结有以下两点:
1.主线程执行了耗时操作,比如数据库操作或网络编程
2.其他进程(就是其他程序)占用CPU导致本进程得不到CPU时间片,比如其他进程的频繁读写操作可能会导致这个问题。

那么如何避免ANR的发生呢或者说ANR的解决办法是什么呢?
1.避免在主线程执行耗时操作,所有耗时操作应新开一个子线程完成,然后再在主线程更新UI。
2.BroadcastReceiver要执行耗时操作时应启动一个service,将耗时操作交给service来完成。
3.避免在Intent Receiver里启动一个Activity,因为它会创建一个新的画面,并从当前用户正在运行的程序上抢夺焦点。如果你的应用程序在响应Intent广 播时需要向用户展示什么,你应该使用Notification Manager来实现。

0

子线程执行文件读写不会CPU满负荷吗?
换个专用的服务器,服务器会优化多任务,不让某个进程占大量CPU。

NIO读写文件、读写混合
NIO是面向缓冲、双向通道的--可以写、也可以读;可以设置为异步。

0

主线程一般来说不建议进行太多操作,毕竟他要用来响应事件,如果你把操作都放到主线程,他就没有时间去响应从而导致ANR

0
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
记一次线程死锁导致的anr问题分析
问题描述:连接蓝牙鼠标后,关闭蓝牙,再重新开启蓝牙,会出现系统界面没有响应提示 分析tracelog: "main" prio=5 tid=1 Blocked group="main" sCount=1 dsCount=0 flags=1 obj=0x741943c8 self=0x7d154c2a00 sysTid=9311 nice=-10 cgrp...
Android主线程进行 Thread.Sleep()会导致ANR吗
首先 先 明白一个问题:什么是ANR Application Not Responding,意思是”应用没有响应“ 以前我的理解就是 “在主线程做了耗时操作”就会引起ANR,现在我觉得我是错误的,ANR的意思是应用没有响应,耗时操作实际上 并不一定会导致没有响应,我对没有响应的理解是 有人(事件或操作)发出了一个请求,但是主线程没有对这个人进行反馈(...
关于ANR线程阻塞那些坑
上次就是由于网关在点击一个ListView OnItemClick事件的时候 直接报ANR相信各位老司机也很清楚 就是说Android 当你点击某个组件五秒没有反应直接就ANR异常导致程序崩溃 那么问题来了到底怎么解决这个问题呢?方案1如果是点击事件的问题我们可以先把点击事件的代码去掉再调试方案2开启子线程另外做同步 因为这样就可以解决线程阻塞的问题 不会出现ANR异常
Android ANR发生原因总结....
ANR(Application Not Responding) Android系统中应用无响应 是Android系统中比较常见的问题,当出现ANR时一般情况会弹出一个带有以下文字的对话框提示: Activity XXX(in XXXXX) is not responding. 比如: 粗略的来分会有两种情况导致ANR: 第一类:dispatchTimeout
主线程中Thread.Sleep()是否会导致ANR?
public class MainActivity extends AppCompatActivity { private static final String TAG = "MainActivity"; @BindView(R.id.btn_test) Button btnTest; @BindView(R.id.tv_tes
Andorid性能优化(五) 之 ANR总结和分析
1 概述 ANR(Application Not responding)是指应用程序无响应,Android中会在主线程中针对不同的场景监控应用程序的响应时间,如果在超出该场景限定的超时时间还没有将逻辑处理完毕就会造成ANR。一般情况下系统会弹出一个对话框告知用户当前应用程序无响应,用户可以选择继续等待或者选择关闭结束掉当前应用程序。 2 ANR的场景 触发ANR的场景这以下这些: Inpu...
为什么Android程序中的Looper.loop()不会造成ANR异常
为什么Android程序中的Looper.loop()不会造成ANR异常标签(空格分隔): 菜鸟 android 作者:陈小默我们在学习Handler的时候一定都接触过Looper这个东西,也知道其中的loop方法会有阻塞等待的过程。那么问题来了:既然主线程被阻塞了,为什么不会造成ANR异常呢?首先这个问题就是错误的,至少有两个概念没有认清:第一,什么是ANR异常?;第二,Android程序阻塞的
为什么Looper.loop()死循环不会导致ANR
为什么loop这个死循环会在主线程执行,不会ANR么? 答:最开始Android的入口ActivityThread里面的main方法,里面有一个巨大的Handler,然后会创建一个主线程的looper对象,这也是为什么直接在主线程拿Handler就有Looper的原因,在其他线程是要自己Looper.prepare()的。 其实整个Android就是在一个Looper的loop循环的,整个An...
Handler机制 与 ANR异常
Handler是线程间通讯的机制,Android中,网络访问、文件处理等耗时操作必须放到子线程中去执行,否则将会造成ANR异常。ANR异常:Application Not Response 应用程序无响应产生ANR异常的原因:在主线程执行了耗时操作,对Activity来说,主线程阻塞5秒将造成ANR异常,对BroadcastReceiver来说,主线程阻塞10秒将会造成ANR异常。解决ANR异常的方
Android的Looper的无限循环为啥不会ANR?
借鉴自知乎https://www.zhihu.com/question/34652589,gityuan ActivityThread中的代码 public static void main(String[] args) { Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "ActivityThreadMain");
为什么主线程中调用了Looper.loop();方法没有卡死?
严格来说呢,是卡死了,在ActivityThread类的main方法中调用了Looper.loop()方法之后,后面再没有其他代码,因为根本执行不到,loop()方法的内部就是个死循环,那么为什么Activity的生命周期方法、屏幕的各种点击触摸事件都能正常响应呢?因为在这个死循环中,是不断的从MessageQueue中获取消息的,有消息就处理,没有消息,...
CountDownLatch 导致主线程一直等待的问题
CountDownLatch 的作用: 能够使一个线程等待其他线程完成各自的工作后再执行.  这里实现的是主线程等待子线程跑完才继续执行. 下面是存在问题的代码片段: @Test public void test2() throws InterruptedException { int threadNum = 5; AtomicInteger atomic = new Atomi...
android ANR异常分析技巧总结
前言 ANR异常是android开发中比较常见的异常之一,最近为了看ANR异常,差了不少资料,现在做一个总结。 本文将从以下几个角度来总结ANR异常分析: ANR类型 ANR产生的原因 ANR日志来源 分析ANR问题的套路 1. ANR类型 ANR类型按报错类型主要有Input(输入事件)、Broadcast(广播)、Service(服务), 对应产生ANR的时间分别为: ...
viewpager setCurrentItem 过多出现卡顿 ANR 线程阻塞 页面无响应
本想让viewpager 默认显示在中间,实现无限轮播,可是,页面会卡住 原因是,viewpager setCurrentItem 设置后,是一页一页滑动到指定位置的,如果设置过多,就会卡死, 解决方法:不要设置太多就好,设置个几十就好 @UiThread void reflashSlideBannerData(String result) { if (resu
为什么Looper死循环不阻塞主线程
Looper(Handler)有一个死循环,却为什么没有阻塞主线程
ANR和Force close产生和原因
一、概念 ANR,程序没有响应,有可能程序会再次响应 例子: 应用运行时,Main线程进行了耗时操作 应用运行时,用户操作过于频繁 Force close:程序抛出异常,会强制退出 例子: 应用运行时抛出了OutOfMemoryError, 应用运行时抛出了RuntimeException 二、出现场景 ANR出现场景: 主线程被IO操作(从4.0之后
分析ANR之iowait偏高
解决了一个anr的bug,在此记录下; 我们首先看log 知道是哪个pid 发送的anr,再看trace文件,找到对应的,如下图; 从图我标出3块红色的地方: 1.第一个红色,看似在等待信号量,其他不懂; 2.第二个红色,应该是打开了strickmode 模式下进行的操作; 3.第三个红色才是自己的代码调用,其实只是用log4j 打印了一条日志,怎么会anr呢?还有,3和2 应该没有什么
ANR问题的检测、诊断及修复
一. ANR简介 描述:UI线程如果停止响应太长的时间, “Application Not Responding” (ANR) 就被触发。 如果被阻塞的app处于前台,系统会显示一个ANR对话框。 触发:以下两个条件,任意各一个都会导致ANR 当app处于前台时,在5s内无法相应用户输入或广播。 当app没有activity处于前台时,广播接收器正在进行长时间的任务,且无法结束。 ...
ANR产生的原因及其定位分析
前言ANR是Android 中独有的概念,全称Application No Responding 如何定位和和避免出现这个问题是Android程序员的必备修养一 、ANR产生的原因1.1 ANR 产生的原因只有当应用程序的UI线程响应超时才会引起ANR 超时产生的原因有两种,1 当前事件没有机会处理,例如UI线程正在响应另外的事件,当前事件被某个事件给阻塞掉了 2 当前事件正在处理 但是由于耗时太
NFC问题分析之死锁引起的ANR
对于Android平台的工程师来说,ANR应该是每个人都会遇到的问题,因为导致它的原因有很多,例如在主线程进行耗时操作,调用大量cpu资源进行复杂的预算等,并且可能在大多数情况下,这类问题不会发生,只会在极端特殊的情况下暴露(例如很长时间的自动化脚本测试,monkey测试),所以我们必须得学会如何去分析这类问题,才能让模块的性能经得住考验。
Android异常捕获demo(可以捕获ANR+UncaughtExceptionHandler)
此demo可以捕获android的异常,可以捕获ANR+UncaughtExceptionHandler类异常,并输出到本地文件,6.0需要添加动态读写权限
Activity启动过程详解
1. 简介 本文源码基于android 27。 startActivity的流程较复杂,我们这里将其过程分成三部分: startActivity–>ActivityManagerService ActivityManagerService–>ApplicationThread ApplicationThread–>Activity 这样看起来稍微简单点。 通
解决app冷启动出现ANR问题
在开发过程中,我们都会必不可免的需要在application文件中初始化一些东西。然后等项目越来越大,需要初始化的东西也就越来越多。所以每当我们冷启动app的时候有时会出现“该程序无法相应”的问题,这就是由于需要初始化的东西太多了,已经超出5秒了,所以出现的ANR。 当然在application中初始化一些东西是必须的,这个无法避免,但是我们可以优化一下这些代码。在这里我提供一种优化的方法,那就
Android ANR分析实践(二):由输入事件无响应产生的ANR分析及解决
首先,我们简单写一个测试应用,手动制造一个ANR,代码如下 public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState...
anr 分析(MessageQueue 主线程处于空闲状态)
call stack如下: "main" prio=5 tid=1 Native   | group="main" sCount=1 dsCount=0 obj=0x76c35ae8 self=0x7e33296a00   | sysTid=23443 nice=0 cgrp=default sched=0/0 handle=0x7e37875a98   | state=S schedst
ANR 出现广播超时的分析
Android 广播处理机制,在逐个处理广播消息时,安卓会设置个时间戳,起个延迟触发消息,如果对某个app的广播接收器处理超时,这个延迟触发消息就被触发成了超时消息,否则消息处理后就会取消这个延迟触发消息。
ANR异常的产生和解决方案
1.概念解释: ANR : Application No Response。 在Android中,应用的响应性被活动管理器(Activity Manager)和窗口管理器(Window Manager)这两个系统服务所监视。当用户触发了输入事件(如键盘输入,点击按钮等),如果应用5秒内没有响应用户的输入事件,那么,Android会认为该应用无响应,便弹出ANR对话框。2.用代码模拟:在主线程s
关于ViewPager设置属性页setCurrentItem会阻塞主线程ANR总结
关于android开发设置View Pager的直接跳转页set CurrentItem会阻塞主线程ANR。 根据网上解决的说法,分析源码: if (mFirstLayout) { // We don't have any idea how big we are yet and shouldn't have any pages either. // Just set thi
将耗时的操作放入handler中进行处理
// 初始化recList public void initRecList() { new Thread() { public void run() { try { sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } doInH...
长时间运行app,产生anr
       app需要实时的更新当前的地址位置信息,在位置监听中进行显示出来,包括经纬的转换,距离目标,在测试几个小时内没有问题,但是在12个小时以上就出现了界面点击无响应。解决办法      调试发现监听中耗时10ms+,在界面更新的范围内,但在长时间却出现anr,说明还是耗时太长,更新频率有问题。解决方法:      1.在位置发现改变时才更新UI      2.经纬度的转换等计算的任务,放...
Android 常见内存泄漏
一、单例造成的内存泄漏 Android的单例模式非常受开发者的喜爱,不过使用的不恰当的话也会造成内存泄漏。因为单例的静态特性使得单例的生命周期和应用的生命周期一样长,这就说明了如果一个对象已经不需要使用了,而单例对象还持有该对象的引用,那么这个对象将不能被正常回收,这就导致了内存泄漏。 如下这个典例: public class AppManager { ...
ANR分析(二)
本篇将主要分享: 3.应用如何避免ANR 4.如何分析ANR问题3. 应用如何避免ANR造成ANR的原因可以分成两大类,系统原因与应用原因。系统原因是指在手机开发过程中,由于Kernel、FrameWork、驱动存在问题,导致系统工作不稳定,最终在应用层表现出来的ANR。如CPU驱动错误导致四核手机只有一个核运行、Kernel将用户空间冻结导致任何程序都不能执行、I/O吞吐量低下导致应用程序长时
什么是ANR?如何避免ANR?
ANR是什么?如何避免ANR?
ANR 原理与实战技巧
首先,每天看到不断有新人关注着这个公众号,心情很是愉悦。一种认可,一种信任,也是我前进的动力。感谢大家的支持与鼓励。     如果你喜欢这篇文章,或者喜欢这个图片,或者有所感悟,或者仅仅因为喜欢代码GG,分享此文到技术群里,以便此文的价值最大化。    再次感谢大家的鼎力支持,抱拳拱手,难表胜意。俯首向前,继续码文,聊表心意。00     手机用用,就卡卡卡。莫名其妙的出现一堆程序无响应,欲哭
【知识必备】Android内存泄漏全解析,从此拒绝ANR,让OOM远离你的身边,跟内存泄漏say byebye
关注楼主的更多博客,总有你想要的:http://www.cnblogs.com/liushilin/ 一、写在前面   对于C++来说,内存泄漏就是new出来的对象没有delete,俗称野指针;而对于java来说,就是new出来的Object放在Heap上无法被GC回收;而这里就把我之前的一篇内存泄漏的总结翻新,做一个更加全面规范的讲解,希望能帮到各位。 二、一些杂谈   
android ANR产生情况、发生原因及解决办法
ANR (Application Not Responding)  ANR定义:在Android上,如果你的应用程序有一段时间响应不够灵敏,系统会向用户显示一个对话框,这个对话框称作应用程序无响应(ANR:Application Not Responding)对话框。用户可以选择“等待”而让程序继续运行,也可以选择“强制关闭”。所以一个流畅的合理的应用程序中不能出现anr,而让用户每次都要处理这个对
ANR的监测与定位Demo
此Demo实现了监测Android应用程序ANR,并且在发生ANR时,对产生ANR的地方进行了定位,从而能在发生ANR后快速找到主线程耗时操作,从而快速修复。
android入门(六) UI线程阻塞及其优化
当一个应用程序启动之后,android系统会为这个应用程序创建一个主线程(Main Thread),它负责渲染视图,分发事件到响应监听器并执行,对界面进行轮询的监听。因此,一般也叫做“UI线程”(UI Thread)。android系统不会给应用程序的多个元素组件建立多个线程来执行。一个视图(Activity)中的多个view组件运行在同一个UI线程当中。因此,多个view组件的监听器的执行可能会相
基于android7.0流程分析anr产生原因
1. 什么是anr ANR(Application Not Responding),即“应用程序无响应”。anr是android自身的一种监测机制,如果ui线程在特定时间无法对输入事件做出响应或则对特定操作没有执行完毕,就会出现anr的情况。 2.anr分类 1,InputEventTimeout 输入事件(按键或触屏事件)超过5s无响应就会弹出anr提示框,供用户选择继续等待程序
Glide4的一个天坑!!!使用不当导致ANR,原因很难排查
Glide3.7用得很熟练了,接手别人一个项目,用的是Glide4.7.1的版本,心想好吧,这下不用自定义圆角Transform了,直接用Glide的API就可以了 然而一用就是ANR。。。。。。。。。。。 不知道哪里出问题,排查,从各个角度去找,就是没想到是Glide的问题,更没想到是ImageView的setTag()问题。。。。 问题:如果Glide加载的图片对象是一个ImageVie...