最近要面試,整理一些經(jīng)常問到用到的知識點
1設(shè)計模式 應(yīng)用場景
Builder模式 alertDialog
單例模式 inputMethod.getNewInstance
適配器模式 各類ListView RecycleView GridView 的適配器
觀察者模式 ContentObserver
抽像工廠模式 BaseActivity
2--設(shè)計框架
mvp mvc
3 消息機制
looper Handler
Looper負責創(chuàng)建一個MessageQueue.并且不斷從Messagequeue中讀取Message
Message則是由Handler創(chuàng)建。
Looper 包含PRepare() loop()二個方法 前者負責創(chuàng)建新的looper 后者負責從當前l(fā)ooper獲得消息隊列.取message然后Dispatch
Looper的主要作用保證每一個線程只有一個LOOPER實例,每個LOOPER實例只有一個MESSAGEQUEUE
Handler
Handler 創(chuàng)建的時候通過Loop.myLooper();去獲得當前線程的實例,從而獲得當前messageQueue實例。
總結(jié):
Looper.prepare()在本線程中保存一個Looper實例,然后該實例中保存一個MessageQueue對象;因為Looper.prepare()在一個線程中只能調(diào)用一次,所以MessageQueue在一個線程中只會存在一個。
2、Looper.loop()會讓當前線程進入一個無限循環(huán),不端從MessageQueue的實例中讀取消息,然后回調(diào)msg.target.dispatchMessage(msg)方法。
3、Handler的構(gòu)造方法,會首先得到當前線程中保存的Looper實例,進而與Looper實例中的MessageQueue想關(guān)聯(lián)。
4、Handler的sendMessage方法,會給msg的target賦值為handler自身,然后加入MessageQueue中。
5、在構(gòu)造Handler實例時,我們會重寫handleMessage方法,也就是msg.target.dispatchMessage(msg)最終調(diào)用的方法。
4,Touch事件分發(fā)機制
View(Button) DispatchtoucEvent -- onTouch -- TouchEvent-- onClick
一個TouchEvent形成后由Acitivity DispatchTouchEvent向下分發(fā) 傳給ViewGroup 傳向View;遇到某一級 return true的情況則到此為止,不再分發(fā)。
return false 會傳給Activity或上一級ViewGroup的OnTouchEvent去處理
事件攔截
ViewGroup會多一個public boolean onInterceptTouchEvent(MotionEvent ev) 方法
如果 onInterceptTouchEvent 返回 true,則表示將事件進行攔截,并將攔截到的事件交由當前 View 的 onTouchEvent 進行處理;
如果 onInterceptTouchEvent 返回 false,則表示將事件放行,當前 View 上的事件會被傳遞到子 View 上,再由子 View 的 dispatchTouchEvent 來開始這個事件的分發(fā);
事件響應(yīng):public boolean onTouchEvent(MotionEvent ev) 在 dispatchTouchEvent 返回 super.dispatchTouchEvent(ev) 并且 onInterceptTouchEvent 返回 true 或返回 super.onInterceptTouchEvent(ev) 的情況下 onTouchEvent 會被調(diào)用。onTouchEvent 的事件響應(yīng)邏輯如下:
如果事件傳遞到當前 View 的 onTouchEvent 方法,而該方法返回了 false,那么這個事件會從當前 View 向上傳遞,并且都是由上層 View 的 onTouchEvent 來接收,如果傳遞到上面的 onTouchEvent 也返回 false,這個事件就會“消失”,而且接收不到下一次事件。
如果返回了 true 則會接收并消費該事件。
如果返回 super.onTouchEvent(ev) 默認處理事件的邏輯和返回 false 時相同。
5,內(nèi)存泄露,內(nèi)存溢出
垃圾回收器無法回收原本應(yīng)該被回收的對象,這個對象就引發(fā)了內(nèi)存泄露。內(nèi)存泄露的危害: (1)過多的內(nèi)存泄露最終會導(dǎo)致內(nèi)存溢出(OOM)(2)內(nèi)存泄露導(dǎo)致可用內(nèi)存不足,會觸發(fā)頻繁GC,不管是Android2.2以前的單線程GC還是現(xiàn)在的CMS和G1,都有一部分的操作會導(dǎo)致用戶線程停止(就是所謂的Stop the world),從而導(dǎo)致UI卡頓。Android為每個進程設(shè)置Dalvik Heap Size閾值,這個閾值在不同的設(shè)備上會因為RAM大小不同而各有差異。如果APP想要分配的內(nèi)存超過這個閾值,就會發(fā)生OOM。
ActivityManager.getMemoryClass()可以查詢當前APP的Heap Size閾值,單位是MB。
7,JNI相關(guān)
8,動畫原理
9,自定義View
新聞熱點
疑難解答