最近要面试,整理一些经常问到用到的知识点
1设计模式 应用场景
Builder模式 alertDialog
单例模式 inputMethod.getNewInstance
适配器模式 各类ListView RecycleView GridView 的适配器
观察者模式 ContentObserver
抽像工厂模式 BaseActivity
2--设计框架
mvp mvc
3 消息机制
looper Handler
Looper负责创建一个MessageQueue.并且不断从Messagequeue中读取Message
Message则是由Handler创建。
Looper 包含PRepare() loop()二个方法 前者负责创建新的looper 后者负责从当前looper获得消息队列.取message然后Dispatch
Looper的主要作用保证每一个线程只有一个LOOPER实例,每个LOOPER实例只有一个MESSAGEQUEUE
Handler
Handler 创建的时候通过Loop.myLooper();去获得当前线程的实例,从而获得当前messageQueue实例。
总结:
Looper.prepare()在本线程中保存一个Looper实例,然后该实例中保存一个MessageQueue对象;因为Looper.prepare()在一个线程中只能调用一次,所以MessageQueue在一个线程中只会存在一个。
2、Looper.loop()会让当前线程进入一个无限循环,不端从MessageQueue的实例中读取消息,然后回调msg.target.dispatchMessage(msg)方法。
3、Handler的构造方法,会首先得到当前线程中保存的Looper实例,进而与Looper实例中的MessageQueue想关联。
4、Handler的sendMessage方法,会给msg的target赋值为handler自身,然后加入MessageQueue中。
5、在构造Handler实例时,我们会重写handleMessage方法,也就是msg.target.dispatchMessage(msg)最终调用的方法。
4,Touch事件分发机制
View(Button) DispatchtoucEvent -- onTouch -- TouchEvent-- onClick
一个TouchEvent形成后由Acitivity DispatchTouchEvent向下分发 传给ViewGroup 传向View;遇到某一级 return true的情况则到此为止,不再分发。
return false 会传给Activity或上一级ViewGroup的OnTouchEvent去处理
事件拦截
ViewGroup会多一个public boolean onInterceptTouchEvent(MotionEvent ev) 方法
如果 onInterceptTouchEvent 返回 true,则表示将事件进行拦截,并将拦截到的事件交由当前 View 的 onTouchEvent 进行处理;
如果 onInterceptTouchEvent 返回 false,则表示将事件放行,当前 View 上的事件会被传递到子 View 上,再由子 View 的 dispatchTouchEvent 来开始这个事件的分发;
事件响应:public boolean onTouchEvent(MotionEvent ev) 在 dispatchTouchEvent 返回 super.dispatchTouchEvent(ev) 并且 onInterceptTouchEvent 返回 true 或返回 super.onInterceptTouchEvent(ev) 的情况下 onTouchEvent 会被调用。onTouchEvent 的事件响应逻辑如下:
如果事件传递到当前 View 的 onTouchEvent 方法,而该方法返回了 false,那么这个事件会从当前 View 向上传递,并且都是由上层 View 的 onTouchEvent 来接收,如果传递到上面的 onTouchEvent 也返回 false,这个事件就会“消失”,而且接收不到下一次事件。
如果返回了 true 则会接收并消费该事件。
如果返回 super.onTouchEvent(ev) 默认处理事件的逻辑和返回 false 时相同。
5,内存泄露,内存溢出
垃圾回收器无法回收原本应该被回收的对象,这个对象就引发了内存泄露。内存泄露的危害: (1)过多的内存泄露最终会导致内存溢出(OOM)(2)内存泄露导致可用内存不足,会触发频繁GC,不管是Android2.2以前的单线程GC还是现在的CMS和G1,都有一部分的操作会导致用户线程停止(就是所谓的Stop the world),从而导致UI卡顿。Android为每个进程设置Dalvik Heap Size阈值,这个阈值在不同的设备上会因为RAM大小不同而各有差异。如果APP想要分配的内存超过这个阈值,就会发生OOM。
ActivityManager.getMemoryClass()可以查询当前APP的Heap Size阈值,单位是MB。
7,JNI相关
8,动画原理
9,自定义View
新闻热点
疑难解答