这是一篇比较基础的文章,其实就是我的复习啦....发现很多东西会忘记,那还不如写出来,好记性不如烂笔头嘛~以后争取多写一些文章,哪怕没人看也要写...这一片说一说关于ANR以及怎么避免ANR的问题
1.什么是ANR?
一般呢,安卓中的主线程(也就是我们常说的UI线程),是不能进行耗时操作的,不然会大概率出现ANR的错误滴~那么什么是ANR呢?全名application not responding,也就是“应用无响应”。当操作在一段时间内系统无法处理时,系统层面就会弹出ANR对话框。
通常呢,有这几种情况会出现ANR:
5S内没有响应用户的输入行为,像是触摸点击屏幕啊,键盘输入呀~
广播接收者(BroadcastReceiver)在10S内没有结束操作,这些都是因为在主线程进行了耗时操作。
2.哪些地方是在主线程中操作的呢?
那么目前我们在开发过程中,都是将耗时操作放入子线程中进行,然后再由子线程通知主线程进行UI上的更新.因为子线程不能对UI进行操作滴...
首先我们需要知道,哪些地方时在主线程中进行的呢?来,客观这边儿请~
1.Activity的所有生命周期方法
2.默认的Service
3.BroadcastReceiver的onReceiver回调
4.AsyncTask的回调除了doInBackground,其他的执行在主线程。
5.View的post(Runable)
6.没有使用子线程的loop的Handler的handMessage、post(Runnable)是执行在主线程的。
以上的这六种场景都是在主线程中的,或许还有我不知道的场景我没有写出来..欢迎大家补充...所以在以上这几种场景中我们不能进行耗时操作,不然可能会引起ANR 的.
3.哪些地方进行耗时操作?
耗时操作:"55555,这也不能去那也不能去,那总得给我们一个家吧!!"
谷歌爸爸:"奥利给,你们可以去这些地方哦~"
1.直接继承Thread或者实现Runable接口
2.使用AsyncTask
3.使用IntentService
4.怎么进行线程间的通信?
1.使用handler进行通信
2.发广播
其实这篇就是我的复习系列的文章,你们可能都知道这些知识,但是我想总结一下写出来,印象会深点.另外我写的不一定都对,我也借鉴很多网上资料以及大神博客,我做的只是总结而已.欢迎大家补充~
网友评论