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