首页 > 学院 > 开发设计 > 正文

2017面试要点

2019-11-09 18:45:25
字体:
来源:转载
供稿:网友

最近要面试,整理一些经常问到用到的知识点

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


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表