ANR面试讲解
2019-05-19 本文已影响0人
崽子猪
一、ANR?
1.什么是anr(Application Not Responding)?
它就是一个应用程序无响应的对话框
拓展:为什么会造成ANR?
在主线程中做了耗时操作
二、造成ANR的主要原因
原因一:主线程做耗时的IO操作导致阻塞(从4.0之后网络IO不允许在主线程中操作)
原因二:主线程中存在耗时操作
拓展:Android中那些操作是在主线程的呢?
Activity的所有生命周期回调都是在主线程的.
Service默认是执行在主线程的.(如果想在Service里做耗时操作你可以启用intentService它里面可以做耗时操作)
BroadcasetReciver的onReceive回调是执行在主线程的.
没有使用子线程的Looper的Handler的handlerMessage,post(Runnable)是执行在主线程的.
AsyncTask的回调除了dolnBackground,其他都是执行在主线程的.
三、如何解决ANR?
解决一:使用Asynctask处理耗时IO操作.
解决二:使用Thread或者HandlerThread提高优先级.
解决三:使用handler来处理工作线程的耗时任务.
解决四:Activity的onCreate和OnResume回调中尽量避免耗时的代码