1 Android事件分發(fā)機(jī)制?
分為三層:Activity、ViewGroup、View。
1、如果事件不被中斷,整個(gè)事件流向是一個(gè)類(lèi)U型圖。
2、dispatchTouchEvent 和 onTouchEvent 一旦return true,事件就停止傳遞了。
3、dispatchTouchEvent 和 onTouchEvent return false的時(shí)候事件都回傳給父控件的onTouchEvent處理。
4.Intercept 的意思就攔截,每個(gè)ViewGroup每次在做分發(fā)的時(shí)候,問(wèn)一問(wèn)攔截器要不要攔截(也就是問(wèn)問(wèn)自己這個(gè)事件要不要自己來(lái)處理)如果要自己處理那就在onInterceptTouchEvent方法中 return true就會(huì)交給自己的onTouchEvent的處理,如果不攔截就是繼續(xù)往子控件往下傳。
ACTION_MOVE和ACTION_UP在傳遞的過(guò)程中并不是和ACTION_DOWN 一樣,你在執(zhí)行ACTION_DOWN的時(shí)候返回了false,后面一系列其它的action就不會(huì)再得到執(zhí)行了。簡(jiǎn)單的說(shuō),就是當(dāng)dispatchTouchEvent在進(jìn)行事件分發(fā)的時(shí)候,只有前一個(gè)事件(如ACTION_DOWN)返回true,才會(huì)收到ACTION_MOVE和ACTION_UP的事件。
如果在某個(gè)控件的dispatchTouchEvent 返回true消費(fèi)終結(jié)事件,那么收到ACTION_DOWN 的函數(shù)也能收到 ACTION_MOVE和ACTION_UP。
對(duì)于ACTION_MOVE、ACTION_UP總結(jié):ACTION_DOWN事件在哪個(gè)控件消費(fèi)了(return true), 那么ACTION_MOVE和ACTION_UP就會(huì)從上往下(通過(guò)dispatchTouchEvent)做事件分發(fā)往下傳,就只會(huì)傳到這個(gè)控件,不會(huì)繼續(xù)往下傳,如果ACTION_DOWN事件是在dispatchTouchEvent消費(fèi),那么事件到此為止停止傳遞,如果ACTION_DOWN事件是在onTouchEvent消費(fèi)的,那么會(huì)把ACTION_MOVE或ACTION_UP事件傳給該控件的onTouchEvent處理并結(jié)束傳遞。
三級(jí)緩存底層實(shí)現(xiàn)
什么是三級(jí)緩存
網(wǎng)絡(luò)緩存, 不優(yōu)先加載, 速度慢,浪費(fèi)流量
本地緩存, 次優(yōu)先加載, 速度快
內(nèi)存緩存, 優(yōu)先加載, 速度最快
三級(jí)緩存原理
首次加載 Android App 時(shí),肯定要通過(guò)網(wǎng)絡(luò)交互來(lái)獲取圖片,之后我們可以將圖片保存至本地SD卡和內(nèi)存中
之后運(yùn)行 App 時(shí),優(yōu)先訪問(wèn)內(nèi)存中的圖片緩存,若內(nèi)存中沒(méi)有,則加載本地SD卡中的圖片
總之,只在初次訪問(wèn)新內(nèi)容時(shí),才通過(guò)網(wǎng)絡(luò)獲取圖片資源
內(nèi)存緩存實(shí)現(xiàn)方法
通過(guò)HashMap鍵值對(duì)的方式保存圖片,key為地址,value為圖片對(duì)象,但因是強(qiáng)引用對(duì)象,很容易造成內(nèi)存溢出,可以嘗試SoftReference軟引用對(duì)象
通過(guò)HashMap>SoftReference 為軟引用對(duì)象(GC垃圾回收會(huì)自動(dòng)回收軟引用對(duì)象),但在Android2.3+后,系統(tǒng)會(huì)優(yōu)先考慮回收弱引用對(duì)象,官方提出使用LruCache
通過(guò)LruCacheleast recentlly use 最少最近使用算法
會(huì)將內(nèi)存控制在一定的大小內(nèi), 超出最大值時(shí)會(huì)自動(dòng)回收, 這個(gè)最大值開(kāi)發(fā)者自己定
HashMap底層實(shí)現(xiàn),hashCode如何對(duì)應(yīng)bucket?
HashMap是基于哈希表實(shí)現(xiàn)的,每一個(gè)元素都是一個(gè)key-value對(duì),其內(nèi)部通過(guò)單鏈表解決沖突問(wèn)題,容量不足(超過(guò)了閾值)時(shí),同樣會(huì)自動(dòng)增長(zhǎng)。
HashMap是非線程安全的,只是用于單線程環(huán)境下,多線程環(huán)境下可以采用concurrent并發(fā)包下的concurrentHashMap。
HashMap實(shí)現(xiàn)了Serializable接口,因此它支持序列化,實(shí)現(xiàn)了Cloneable接口,能被克隆。
tcp和udp的區(qū)別,tcp如何保證可靠的,丟包如何處理?
TCP與UDP的區(qū)別
TCP面向有鏈接的通信服務(wù) ?UDP面向無(wú)連接的通信服務(wù)
TCP提供可靠的通信傳輸 ? ? ?UDP不可靠,會(huì)丟包
TCP保證數(shù)據(jù)順序 ? ? ? ? ? ? ? ? UDP不保證
TCP數(shù)據(jù)無(wú)邊界 ? ? ? ? ? ? ? ? ? ? UDP有邊界
TCP速度快 ? ? ? ? ? ? ? ? ? ? ? ? ? UDP速度慢
TCP面向字節(jié)流 ? ? ? ? ? ? ? ? ? ?UDP面向報(bào)文
TCP一對(duì)一 ? ? ? ? ? ? ? ? ? ? ? ? ? ?UDP可以一對(duì)一,一對(duì)多
TCP報(bào)頭至少20字節(jié) ? ? ? ? ? ? UDP報(bào)頭8字節(jié)
TCP有流量控制,擁塞控制 ? ?UDP沒(méi)有
為什么UDP比TCP快
TCP需要三次握手
TCP有擁塞控制,控制流量等機(jī)制
為什么TCP比UDP可靠
TCP是面向有連接的,建立連接之后才發(fā)送數(shù)據(jù);而UDP則不管對(duì)方存不存在都會(huì)發(fā)送數(shù)據(jù)。
TCP有確認(rèn)機(jī)制,接收端每收到一個(gè)正確包都會(huì)回應(yīng)給發(fā)送端。超時(shí)或者數(shù)據(jù)包不完整的話發(fā)送端會(huì)重傳。UDP沒(méi)有。因此可能丟包。