若是你在中小廠,這些你必定要搞懂

今天給你們分享一些初中級的面試專題,比較適合在一些中小廠的開發者,跟隨我一塊兒來看看吧。android

一樣,關於下列PDF裏全部的知識,絕大部分有配套的視頻.代碼.源碼.資料和筆記,對於我整理的核心PDF筆記感興趣的
能夠點擊關於我聯繫我獲取
(VX:mm14525201314)git

(更多完整項目下載。未完待續。源碼。圖文知識後續上傳github。)

初級面試專題(中小廠)

一、致使內存泄露的緣由有哪些?

內存泄露的根本緣由:長生命週期的對象持有短生命週期的對象。短週期對象就沒法及時釋放。github

靜態內部類非靜態內部類的區別(Handler 引發的內存泄漏。)面試

靜態集合類引發內存泄露網絡

單例模式引發的內存泄漏。mvc

解決:Context是ApplicationContext,因爲ApplicationContext的生命週期是和app一致的,不會致使內存泄漏app

註冊/反註冊未成對使用引發的內存泄漏。mvvm

集合對象沒有及時清理引發的內存泄漏。一般會把一些對象裝入到集合中,當不使用的時候必定要記得及時清理集合,讓相關對象再也不被引用。函數

減小內存對象的佔用oop

  • ArrayMap/SparseArray代替hashmap
  • 避免在android裏面使用Enum
  • 減小bitmap的內存佔用

    • inSampleSize:縮放比例,在把圖片載入內存以前,咱們須要先計算出一個合適的縮放比例,避免沒必要要的大圖載入。
    • decode format:解碼格式,選擇ARGB_8888/RBG_565/ARGB_4444/ALPHA_8,存在很大差別。
  • 減小資源圖片的大小,過大的圖片能夠考慮分段加載
二、理解Activity,View,Window三者關係

這個問題真的很很差回答。因此這裏先來個算是比較恰當的比喻來形容下它們的關係吧。Activity像一個工匠(控制單元),Window像窗戶(承載模型),View像窗花(顯示視圖)LayoutInflater像剪刀,Xml配置像窗花圖紙。

  • Activity構造的時候會初始化一個Window,準確的說是PhoneWindow
  • 這個PhoneWindow有一個「ViewRoot」,這個「ViewRoot」是一個View或者說ViewGroup,是最初始的根視圖。
  • ViewRoot經過addView方法來一個個的添加View。好比TextView,Button等
  • 這些View的事件監聽,是由WindowManagerService來接受消息,而且回調Activity函數。好比onClickListeneronKeyDown等。
三、Handler的原理

因此就有了handler,它的做用就是實現線程之間的通訊。

handler整個流程中,主要有四個對象,handlerMessage,MessageQueue,Looper。當應用建立的時候,就會在主線程中建立handler對象,

咱們經過要傳送的消息保存到Message中,handler經過調用sendMessage方法將Message發送到MessageQueue中,Looper對象就會不斷的調用loop()方法

不斷的從MessageQueue中取出Message交給handler進行處理。從而實現線程之間的通訊。

四、View,ViewGroup事件分發
  1. Touch事件分發中只有兩個主角:ViewGroupViewViewGroup包含onInterceptTouchEventdispatchTouchEventonTouchEvent三個相關事件。View包含dispatchTouchEventonTouchEvent兩個相關事件。其中ViewGroup又繼承於View。

2.ViewGroup和View組成了一個樹狀結構,根節點爲Activity內部包含的一個ViwGroup

3.觸摸事件由Action_Down、Action_Move、Aciton_UP組成,其中一次完整的觸摸事件中,Down和Up都只有一個,Move有若干個,能夠爲0個。

4.當Acitivty接收到Touch事件時,將遍歷子View進行Down事件的分發。ViewGroup的遍歷能夠當作是遞歸的。分發的目的是爲了找到真正要處理本次完整觸摸事件的View,這個View會在onTouchuEvent結果返回true。

5.當某個子View返回true時,會停止Down事件的分發,同時在ViewGroup中記錄該子View。接下去的Move和Up事件將由該子View直接進行處理。

因爲子View是保存在ViewGroup中的,多層ViewGroup的節點結構時,上級ViewGroup保存的會是真實處理事件的View所在的ViewGroup對象:如ViewGroup0-ViewGroup1-TextView的結構中,TextView返回了true,它將被保存在ViewGroup1中,而ViewGroup1也會返回true,被保存在ViewGroup0中。當Move和UP事件來時,會先從ViewGroup0傳遞至ViewGroup1,再由ViewGroup1傳遞至TextView

6.當ViewGroup中全部子View都不捕獲Down事件時,將觸發ViewGroup自身的onTouch事件。觸發的方式是調用super.dispatchTouchEvent函數,即父類View的dispatchTouchEvent方法。在全部子View都不處理的狀況下,觸發AcitivityonTouchEvent方法。

7.onInterceptTouchEvent有兩個做用:1.攔截Down事件的分發。2.停止Up和Move事件向目標View傳遞,使得目標View所在的ViewGroup捕獲Up和Move事件。

五、onNewIntent()何時調用?(singleTask)
六、mvc 和 mvp mvvm

MCP.MVVM項目實戰代碼.筆記

1.mvc:數據、View、Activity,View將操做反饋給Activity,Activitiy去獲取數據,數據經過觀察者模式刷新給View。循環依賴Activity,很難單元測試View和Model耦合嚴重

2.mvp:數據、View、Presenter,View將操做給Presenter,Presenter去獲取數據,數據獲取好了返回給Presenter,Presenter去刷新View。PV,PM雙向依賴

3.mvvm:數據、View、ViewModel,View將操做給ViewModel,ViewModel去獲取數據,數據和界面綁定了,數據更新界面更新。

  • viewModel的業務邏輯能夠單獨拿來測試
  • 一個view 對應一個 viewModel 業務邏輯能夠分離,不會出現全能類
  • 數據和界面綁定了,不用寫垃圾代碼,可是複用起來不舒服
七、自定義控件

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

第一步:OnMeasure():測量視圖大小。從頂層父View到子View遞歸調用measure方法,measure方法又回調OnMeasure。
第二步:OnLayout():肯定View位置,進行頁面佈局。從頂層父View向子View的遞歸調用view.layout方法的過程,即父View根據上一步measure子View所獲得的佈局大小和佈局參數,將子View放在合適的位置上。
第三步:OnDraw():繪製視圖。ViewRoot建立一個Canvas對象,而後調用OnDraw()。
六個步驟:
①、繪製視圖的背景;
②、保存畫布的圖層(Layer);
③、繪製View的內容;
④、繪製View子視圖,若是沒有就不用;
⑤、還原圖層(Layer);⑥、繪製滾動條。
八、Serializable和Parcelable 的區別
P 消耗內存小
網絡傳輸用S 程序內使用P
S將數據持久化方便
S使用了反射 容易觸發垃圾回收 比較慢

img.png

相關文章
相關標籤/搜索