ANR类型及解决方法 && 基本算法 && HashMap原理

一、ANR类型

ANR(Application Not Responding,即应用无响应)一般有三种类型:

1:KeyDispatchTimeout(5 seconds) --主要类型
按键或触摸事件在特定时间内无响应,dispatchTimeout 输入事件分发超时,一般是由于主线程在5秒之内没有响应输入事件。具体的超时时间的定义在framework下的ActivityManagerService.java。

2:BroadcastTimeout(10 seconds)
BroadcastReceiver在特定时间内无法处理完成

3:ServiceTimeout(20 seconds) --小概率类型
Service在特定的时间内无法处理完成

 

二、超时原因
超时时间的计数一般是从按键分发给app开始。超时的原因一般有两种:
(1)当前的事件没有机会得到处理(即UI线程正在处理前一个事件,没有及时的完成或者looper被某种原因阻塞住了)
(2)当前的事件正在处理,但没有及时完成

 

三:如何避免KeyDispatchTimeout
1:UI线程尽量只做跟UI相关的工作,应该避免在BroadcastReceiver里做耗时的操作或计算,替代的是,如果响应Intent广播需要执行一个耗时的动作的话,应用程序应该启动一个 Service。
2:耗时的工作(比如数据库操作,I/O,连接网络或者别的有可能阻碍UI线程的操作)把它放入单独的线程处理
3:尽量用Handler来处理UIthread和别的thread之间的交互

 

--------------------------------------------------------------------基本算法----------------------------------------------------------------------------------------------------

1.图的遍历之深度优先搜索(Depth First Search):
假设初始状态是图中所有的点未曾访问,则深度优先搜索可从图中的某个顶点v出发,然后依次从v的未被访问的临界点出发深度有限遍历图,直至图中所有和v有路径相通的点都被访问到。若图中尚有点未被访问,则另选图中一个未曾被访问的点作为起始点,重复上述过程,直至图中所有的点都被访问到为止。

 

2.图的遍历之广度优先搜索(Breadth First Search):
假设从图中某个顶点v出发,在访问了v之后依次访问v的各个未曾访问过的邻接点,然后分别从这些邻接点出发依次访问它们的邻接点,并使“先被访问的顶点的邻接点”先于“后被访问的顶点的邻接点”被访问,直至图中所有已被访问的定点的邻接点都被访问为止。
换句话说,广度优先遍历的过程是以v为起始点,由近及远,依次访问和v有路径相通且路径长度依次为1,2,...的顶点。

 

3.冒泡排序(Bubble Sort):
首先将第一个记录和第二个记录比较,若为逆序,则将两个记录交换,然后比较第二个记录和第三个记录,依次类推,直到第n-1和n进行比较为止。上述过程称为第一趟冒泡排序,其结果使得最大的记录被安置到最后的位置上。然后进行第二趟冒泡排序,对前n-1个记录进行同样的操作,其结果是次大的记录被安置到n-1的位置。整个过程需要n(n-1)/2次比较,时间复杂度为O(n*n)。

 

4.快速排序(Quick Sort):
是对冒泡排序的一种改进。它的基本思想是:先选取一个中间数,通过一趟排序将记录分成两个部分,一边的记录均比另一边小,然后分别对这两部分记录进行排序,以达到整个序列有序。

 

5.希尔排序

http://www.cnblogs.com/jingmoxukong/p/4303279.html

希尔排序的基本思想是:
把记录按步长 gap 分组,对每组记录采用直接插入排序方法进行排序。
随着步长逐渐减小,所分成的组包含的记录越来越多,当步长的值减小到 1 时,整个数据合成为一组,构成一组有序记录,则完成排序。

6.二分查找或折半查找(Binary Search):
在一组已经从小到大有序的记录中,假设指针low和high分别指示上界和下届,mid指示中间位置。然后比较给定值key和mid的大小,如果key < mid,那么high = mid,再重新求得mid值,然后再跟key比较,直到查找成功为止。

 

7.哈希查找:

哈希查找是为了快速查找记录的一种算法,它利用的数据结构是哈希表,即以空间换取时间的算法,例如:在图书馆中,根据每个人的名字来查找个人信息(借书时间,名字等),这些信息存放于数据库中,即物理存储系统中,比如xiaozhang,哈希算法可以是:把他的信息存放于把名字的每个字母之和的物理地址上,当然这是理想化的,肯定会比这个复杂的

-----------------------------------------------------------------------------HashMap原理-------------------------------------------------------------------------------------------------------

 

1.HashMap的数据结构

  数组的特点是:寻址容易,插入和删除困难;而链表的特点是:寻址困难,插入和删除容易。那么我们能不能综合两者的特性,做出一种寻址容易,插入删除也容易的数据结构?答案是肯定的,这就是我们要提起的哈希表,哈希表有多种不同的实现方法,我接下来解释的是最常用的一种方法—— 拉链法,我们可以理解为“链表的数组” ,如图:

从上图我们可以发现哈希表是由数组+链表组成的,一个长度为16的数组中,每个元素存储的是一个链表的头结点。那么这些元素是按照什么样的规则存储到数组中呢。一般情况是通过hash(key)%len获得,也就是元素的key的哈希值对数组长度取模得到。比如上述哈希表中,12%16=12,28%16=12,108%16=12,140%16=12。所以12、28、108以及140都存储在数组下标为12的位置。
最后对于放在一列的12、28、108以及140,可以通过再次哈希或者其他函数计算存储位置,过程就像找图书馆里的书一样,所以时间复杂度是O(1).

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值