今天給你們分享一些初中級的面試專題,比較適合在一些中小廠的開發者,跟隨我一塊兒來看看吧。android
一樣,關於下列PDF裏全部的知識,絕大部分有配套的視頻.代碼.源碼.資料和筆記,對於我整理的核心PDF筆記感興趣的
能夠點擊關於我聯繫我獲取
(VX:mm14525201314)git
(更多完整項目下載。未完待續。源碼。圖文知識後續上傳github。)
內存泄露的根本緣由:長生命週期的對象持有短生命週期的對象。短週期對象就沒法及時釋放。github
靜態內部類非靜態內部類的區別(Handler 引發的內存泄漏。)面試
靜態集合類引發內存泄露網絡
單例模式引發的內存泄漏。mvc
解決:Context是ApplicationContext
,因爲ApplicationContext
的生命週期是和app一致的,不會致使內存泄漏app
註冊/反註冊未成對使用引發的內存泄漏。mvvm
集合對象沒有及時清理引發的內存泄漏。一般會把一些對象裝入到集合中,當不使用的時候必定要記得及時清理集合,讓相關對象再也不被引用。函數
減小內存對象的佔用oop
ArrayMap/SparseArray
代替hashmap
Enum
減小bitmap的內存佔用
inSampleSize
:縮放比例,在把圖片載入內存以前,咱們須要先計算出一個合適的縮放比例,避免沒必要要的大圖載入。這個問題真的很很差回答。因此這裏先來個算是比較恰當的比喻來形容下它們的關係吧。Activity像一個工匠(控制單元),Window像窗戶(承載模型),View像窗花(顯示視圖)LayoutInflater
像剪刀,Xml
配置像窗花圖紙。
PhoneWindow
。PhoneWindow
有一個「ViewRoot
」,這個「ViewRoot
」是一個View或者說ViewGroup
,是最初始的根視圖。ViewRoot
經過addView
方法來一個個的添加View。好比TextView
,Button等WindowManagerService
來接受消息,而且回調Activity函數。好比onClickListener
,onKeyDown
等。因此就有了handler,它的做用就是實現線程之間的通訊。
handler整個流程中,主要有四個對象,handler
,Message
,MessageQueue
,Looper
。當應用建立的時候,就會在主線程中建立handler對象,
咱們經過要傳送的消息保存到Message中,handler經過調用sendMessage
方法將Message發送到MessageQueue
中,Looper
對象就會不斷的調用loop()方法
不斷的從MessageQueue
中取出Message交給handler進行處理。從而實現線程之間的通訊。
ViewGroup
和View
。ViewGroup
包含onInterceptTouchEvent
、dispatchTouchEvent
、onTouchEvent
三個相關事件。View包含dispatchTouchEvent
、onTouchEvent
兩個相關事件。其中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都不處理的狀況下,觸發Acitivity
的onTouchEvent
方法。
7.onInterceptTouchEvent
有兩個做用:1.攔截Down事件的分發。2.停止Up和Move事件向目標View傳遞,使得目標View所在的ViewGroup
捕獲Up和Move事件。
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去獲取數據,數據和界面綁定了,數據更新界面更新。
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);⑥、繪製滾動條。
P 消耗內存小
網絡傳輸用S 程序內使用P
S將數據持久化方便
S使用了反射 容易觸發垃圾回收 比較慢