1.事件分发机制

将点击事件MostionEvent,向某个View进行传递并得到最终的处理,这个传递的过程就是事件分发,

默认情况下:一个传递的过程就是从Activity--ViewGroup--View,由上向下进行传递,如果没有人进行处

理,然后会从View向上进行回传.

事件分发机制主要是为了处理事件冲突。

比如在项目当中ScrollView中嵌套ListView我们 在合适的使用情况下看是走ListView还是ScrollView当我们拦截事件一种是父view不拦截,另一种是子view请求不拦截事件当我们滑动listview的时候向下滑当ListView的条目第0个在顶端那我们就可以判断一下走ScrollView,当手势想上滑动的时候最后一个显示的时候这样我们就不让ListView不拦截事件,走ScrollView事件

 

2.三级缓存

三级缓存分为内存缓存、磁盘缓存、网络缓存,我们在加载图片的时候,首先从内存中读取,如果内存中没有,然后从磁盘中读取,如果磁盘中没有,从网络进行下载,把下载的图片加载到内存中和磁盘中各一份,从内存中读取图片,因为手机的内存有限,不能加载过多的图片,如果加载过多会导致OOM,所以从内存缓存使用LRUcache,它会将强引用对象放在LinkedHashMap中,当缓存数据大小达到预定值的时候,会使用LRUcache在该集合中比较少使用的对象从内存中移除然后把新的图片加载到队尾.

 

3.动态权限

从安卓6.0之后,为了保护用户的隐私和安全,google推荐了动态权限,当用户授权的时候才可以获取.处理过程:首先检测用户是否授权,如果没有会提示用户授权,如果用户拒绝,我们会引导用户去开启权限,如果用户点击不在提示,为了用户点击按钮无响应,我们会自定义提示框,来提示用户去授权.

 

4.观察者设计模式

这种模式就是当目标数据发生改变的时候,与之对应的观察者对象的数据也会跟着一起改变,让其响应这种变化

优点:数据层和逻辑层实现解耦合,可以定义一种稳定的触发机制

缺点:如果被观察者有多个间接的观察者,会消耗更多的时间,如果观察者与被观察者循环依赖,最终会导致系统崩溃.

它的使用场景:比如广播,游戏,聊天,listviw通知数据发生变化这些都是观察者设计模式

 

5.HashMap理解

HashMap主要是用数组来存储数据的,以键值对进行存储的,底层是一个哈希数组,然后他的构造,有两个参数,一个容量大小和加载因子,里面会有一个阀值,就是单容量*加载因子大于阈值的时候,hashMap就进行扩容,扩容它会新建一个数组,把原有的值给copy新的数组,重新计算位置,这样它会消耗性能,我们需要对它进行一个优化,重新预估.

我们都知道它在存储的时候会对key进行哈希运算,哈希运算会有重复的哈希值,对于哈希值的冲突,HashMap采用链表来解决的Entry,就是HashMap存储数据所用的类,它拥有的属性如下

final K key;

V value;

final int hash;

Entry<K,V> next;

next就是为了哈希冲突而存在的。比如通过哈希运算,一个新元素应该在数组的第10个位置,但是第10个位置已经有Entry,将新加的元素也放到第10个位置,将第10个位置的原有Entry赋值给当前新加的 Entry的next属性。数组存储的是链表,链表是为了解决哈希冲突的 

(问:“你用过HashMap,你能跟我说说它吗?”

 答:“当然用过,HashMap是一种<key,value>的存储结构,能够快速将key的数据put方式存储起来,然后很快的通过get取出来”,然后说“HashMap不是线程安全的,

HashTable是线程安全的,通过synchronized实现的。HashMap取值非常快”等等。这个时候说明他已经很熟练使用HashMap的工具了。)

 

6.Handler机制原理

Handler在android开发中可谓随处可见,Handler主要用于异步消息的处理:当发出一个消息之后,首先进入一个消息队列,一个Handler允许发送和处理Message和Runable对象,UI主线程会自动分配一个Looper(消息轮询器),每个Looper中封装着MessageQueue(消息队列),遵循先进先出原则。Looper负责不断的从自己的消息队列里取出队头的任务或消息执行。一般是在子线程执行完耗时操作之后,通过Handler的sendMessage或post方法将Message和Runable对象传递给MessageQueue

6.1 Android中为什么主线程不会因为Looper.loop()里的死循环卡死?

对于线程既然是一段可执行的代码,简单说就是在主线程的MessageQueue没有消息时,便阻塞在loop的queue.next()中的nativePollOnce()方法里,此时主线程会释放CPU资源进入休眠状态,直到下个消息到达或者有事务发生,所以说,主线程大多数时候都是处于休眠状态,并不会消耗大量CPU资源