阿里Android面試題

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)有。因此可能丟包。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容