溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如果你在中小廠,這些你一定要搞懂

發(fā)布時(shí)間:2020-06-08 19:32:06 來(lái)源:網(wǎng)絡(luò) 閱讀:202 作者:Android丶VG 欄目:移動(dòng)開(kāi)發(fā)

今天給大家分享一些初中級(jí)的面試專(zhuān)題,比較適合在一些中小廠的開(kāi)發(fā)者,跟隨我一起來(lái)看看吧。

同樣,關(guān)于下列PDF里所有的知識(shí),絕大部分有配套的視頻.代碼.源碼.資料和筆記,對(duì)于我整理的核心PDF筆記感興趣的
https://github.com/xiangjiana/androids

(更多完整項(xiàng)目下載。未完待續(xù)。源碼。圖文知識(shí)后續(xù)上傳github。)

如果你在中小廠,這些你一定要搞懂

初級(jí)面試專(zhuān)題(中小廠)

1、導(dǎo)致內(nèi)存泄露的原因有哪些?

內(nèi)存泄露的根本原因:長(zhǎng)生命周期的對(duì)象持有短生命周期的對(duì)象。短周期對(duì)象就無(wú)法及時(shí)釋放。

靜態(tài)內(nèi)部類(lèi)非靜態(tài)內(nèi)部類(lèi)的區(qū)別(Handler?引起的內(nèi)存泄漏。)

靜態(tài)集合類(lèi)引起內(nèi)存泄露

單例模式引起的內(nèi)存泄漏。

解決:Context是ApplicationContext,由于ApplicationContext的生命周期是和app一致的,不會(huì)導(dǎo)致內(nèi)存泄漏

注冊(cè)/反注冊(cè)未成對(duì)使用引起的內(nèi)存泄漏。

集合對(duì)象沒(méi)有及時(shí)清理引起的內(nèi)存泄漏。通常會(huì)把一些對(duì)象裝入到集合中,當(dāng)不使用的時(shí)候一定要記得及時(shí)清理集合,讓相關(guān)對(duì)象不再被引用。

減少內(nèi)存對(duì)象的占用

  • ArrayMap/SparseArray代替hashmap

  • 避免在android里面使用Enum

  • 減少bitmap的內(nèi)存占用

    • inSampleSize:縮放比例,在把圖片載入內(nèi)存之前,我們需要先計(jì)算出一個(gè)合適的縮放比例,避免不必要的大圖載入。

    • decode format:解碼格式,選擇ARGB_8888/RBG_565/ARGB_4444/ALPHA_8,存在很大差異。
  • 減少資源圖片的大小,過(guò)大的圖片可以考慮分段加載
    2、理解Activity,View,Window三者關(guān)系

這個(gè)問(wèn)題真的很不好回答。所以這里先來(lái)個(gè)算是比較恰當(dāng)?shù)谋扔鱽?lái)形容下它們的關(guān)系吧。Activity像一個(gè)工匠(控制單元),Window像窗戶(承載模型),View像窗花(顯示視圖)LayoutInflater像剪刀,Xml配置像窗花圖紙。

  • Activity構(gòu)造的時(shí)候會(huì)初始化一個(gè)Window,準(zhǔn)確的說(shuō)是PhoneWindow。

  • 這個(gè)PhoneWindow有一個(gè)“ViewRoot”,這個(gè)“ViewRoot”是一個(gè)View或者說(shuō)ViewGroup,是最初始的根視圖。

  • ViewRoot通過(guò)addView方法來(lái)一個(gè)個(gè)的添加View。比如TextView,Button等

  • 這些View的事件監(jiān)聽(tīng),是由WindowManagerService來(lái)接受消息,并且回調(diào)Activity函數(shù)。比如onClickListeneronKeyDown等。
3、Handler的原理

所以就有了handler,它的作用就是實(shí)現(xiàn)線程之間的通信。

handler整個(gè)流程中,主要有四個(gè)對(duì)象,handler,Message,MessageQueue,Looper。當(dāng)應(yīng)用創(chuàng)建的時(shí)候,就會(huì)在主線程中創(chuàng)建handler對(duì)象,

我們通過(guò)要傳送的消息保存到Message中,handler通過(guò)調(diào)用sendMessage方法將Message發(fā)送到MessageQueue中,Looper對(duì)象就會(huì)不斷的調(diào)用loop()方法

不斷的從MessageQueue中取出Message交給handler進(jìn)行處理。從而實(shí)現(xiàn)線程之間的通信。

4、View,ViewGroup事件分發(fā)
  1. Touch事件分發(fā)中只有兩個(gè)主角:ViewGroupViewViewGroup包含onInterceptTouchEvent、dispatchTouchEvent、onTouchEvent三個(gè)相關(guān)事件。View包含dispatchTouchEvent、onTouchEvent兩個(gè)相關(guān)事件。其中ViewGroup又繼承于View。

2.ViewGroup和View組成了一個(gè)樹(shù)狀結(jié)構(gòu),根節(jié)點(diǎn)為Activity內(nèi)部包含的一個(gè)ViwGroup。

3.觸摸事件由Action_Down、Action_Move、Aciton_UP組成,其中一次完整的觸摸事件中,Down和Up都只有一個(gè),Move有若干個(gè),可以為0個(gè)。

4.當(dāng)Acitivty接收到Touch事件時(shí),將遍歷子View進(jìn)行Down事件的分發(fā)。ViewGroup的遍歷可以看成是遞歸的。分發(fā)的目的是為了找到真正要處理本次完整觸摸事件的View,這個(gè)View會(huì)在onTouchuEvent結(jié)果返回true。

5.當(dāng)某個(gè)子View返回true時(shí),會(huì)中止Down事件的分發(fā),同時(shí)在ViewGroup中記錄該子View。接下去的Move和Up事件將由該子View直接進(jìn)行處理。

由于子View是保存在ViewGroup中的,多層ViewGroup的節(jié)點(diǎn)結(jié)構(gòu)時(shí),上級(jí)ViewGroup保存的會(huì)是真實(shí)處理事件的View所在的ViewGroup對(duì)象:如ViewGroup0-ViewGroup1-TextView的結(jié)構(gòu)中,TextView返回了true,它將被保存在ViewGroup1中,而ViewGroup1也會(huì)返回true,被保存在ViewGroup0中。當(dāng)Move和UP事件來(lái)時(shí),會(huì)先從ViewGroup0傳遞至ViewGroup1,再由ViewGroup1傳遞至TextView。

6.當(dāng)ViewGroup中所有子View都不捕獲Down事件時(shí),將觸發(fā)ViewGroup自身的onTouch事件。觸發(fā)的方式是調(diào)用super.dispatchTouchEvent函數(shù),即父類(lèi)View的dispatchTouchEvent方法。在所有子View都不處理的情況下,觸發(fā)AcitivityonTouchEvent方法。

7.onInterceptTouchEvent有兩個(gè)作用:1.攔截Down事件的分發(fā)。2.中止Up和Move事件向目標(biāo)View傳遞,使得目標(biāo)View所在的ViewGroup捕獲Up和Move事件。

5、onNewIntent()什么時(shí)候調(diào)用?(singleTask)
6、mvc?和?mvp mvvm

如果你在中小廠,這些你一定要搞懂
MCP.MVVM項(xiàng)目實(shí)戰(zhàn)代碼.筆記

1.mvc:數(shù)據(jù)、View、Activity,View將操作反饋給Activity,Activitiy去獲取數(shù)據(jù),數(shù)據(jù)通過(guò)觀察者模式刷新給View。循環(huán)依賴(lài)Activity,很難單元測(cè)試View和Model耦合嚴(yán)重

2.mvp:數(shù)據(jù)、View、Presenter,View將操作給Presenter,Presenter去獲取數(shù)據(jù),數(shù)據(jù)獲取好了返回給Presenter,Presenter去刷新View。PV,PM雙向依賴(lài)

3.mvvm:數(shù)據(jù)、View、ViewModel,View將操作給ViewModel,ViewModel去獲取數(shù)據(jù),數(shù)據(jù)和界面綁定了,數(shù)據(jù)更新界面更新。

  • viewModel的業(yè)務(wù)邏輯可以單獨(dú)拿來(lái)測(cè)試

  • 一個(gè)view?對(duì)應(yīng)一個(gè)?viewModel?業(yè)務(wù)邏輯可以分離,不會(huì)出現(xiàn)全能類(lèi)

  • 數(shù)據(jù)和界面綁定了,不用寫(xiě)垃圾代碼,但是復(fù)用起來(lái)不舒服
7、自定義控件

View的繪制流程:OnMeasure()——>OnLayout()——>OnDraw()

第一步:OnMeasure():測(cè)量視圖大小。從頂層父View到子View遞歸調(diào)用measure方法,measure方法又回調(diào)OnMeasure。
第二步:OnLayout():確定View位置,進(jìn)行頁(yè)面布局。從頂層父View向子View的遞歸調(diào)用view.layout方法的過(guò)程,即父View根據(jù)上一步measure子View所得到的布局大小和布局參數(shù),將子View放在合適的位置上。?
第三步:OnDraw():繪制視圖。ViewRoot創(chuàng)建一個(gè)Canvas對(duì)象,然后調(diào)用OnDraw()。
六個(gè)步驟:
①、繪制視圖的背景;
②、保存畫(huà)布的圖層(Layer);
③、繪制View的內(nèi)容;
④、繪制View子視圖,如果沒(méi)有就不用;
⑤、還原圖層(Layer);⑥、繪制滾動(dòng)條。

8、Serializable和Parcelable?的區(qū)別

P?消耗內(nèi)存小
網(wǎng)絡(luò)傳輸用S?程序內(nèi)使用P
S將數(shù)據(jù)持久化方便
S使用了反射 容易觸發(fā)垃圾回收 比較慢

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI