今天給大家分享一些初中級(jí)的面試專題,比較適合在一些中小廠的開發(fā)者,跟隨我一起來(lái)看看吧。
在成都網(wǎng)站建設(shè)、做網(wǎng)站中從網(wǎng)站色彩、結(jié)構(gòu)布局、欄目設(shè)置、關(guān)鍵詞群組等細(xì)微處著手,突出企業(yè)的產(chǎn)品/服務(wù)/品牌,幫助企業(yè)鎖定精準(zhǔn)用戶,提高在線咨詢和轉(zhuǎn)化,使成都網(wǎng)站營(yíng)銷成為有效果、有回報(bào)的無(wú)錫營(yíng)銷推廣。創(chuàng)新互聯(lián)公司專業(yè)成都網(wǎng)站建設(shè)10余年了,客戶滿意度97.8%,歡迎成都創(chuàng)新互聯(lián)客戶聯(lián)系。
同樣,關(guān)于下列PDF里所有的知識(shí),絕大部分有配套的視頻.代碼.源碼.資料和筆記,對(duì)于我整理的核心PDF筆記感興趣的
https://github.com/xiangjiana/androids
(更多完整項(xiàng)目下載。未完待續(xù)。源碼。圖文知識(shí)后續(xù)上傳github。)
內(nèi)存泄露的根本原因:長(zhǎng)生命周期的對(duì)象持有短生命周期的對(duì)象。短周期對(duì)象就無(wú)法及時(shí)釋放。
靜態(tài)內(nèi)部類非靜態(tài)內(nèi)部類的區(qū)別(Handler?引起的內(nèi)存泄漏。)
靜態(tài)集合類引起內(nèi)存泄露
單例模式引起的內(nèi)存泄漏。
解決:Context是ApplicationContext
,由于ApplicationContext
的生命周期是和app一致的,不會(huì)導(dǎo)致內(nèi)存泄漏
注冊(cè)/反注冊(cè)未成對(duì)使用引起的內(nèi)存泄漏。
集合對(duì)象沒有及時(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è)合適的縮放比例,避免不必要的大圖載入。
這個(gè)問題真的很不好回答。所以這里先來(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
通過addView
方法來(lái)一個(gè)個(gè)的添加View。比如TextView
,Button等
WindowManagerService
來(lái)接受消息,并且回調(diào)Activity函數(shù)。比如onClickListener
,onKeyDown
等。所以就有了handler,它的作用就是實(shí)現(xiàn)線程之間的通信。
handler整個(gè)流程中,主要有四個(gè)對(duì)象,handler
,Message
,MessageQueue
,Looper
。當(dāng)應(yīng)用創(chuàng)建的時(shí)候,就會(huì)在主線程中創(chuàng)建handler對(duì)象,
我們通過要傳送的消息保存到Message中,handler通過調(diào)用sendMessage
方法將Message發(fā)送到MessageQueue
中,Looper
對(duì)象就會(huì)不斷的調(diào)用loop()方法
不斷的從MessageQueue
中取出Message交給handler進(jìn)行處理。從而實(shí)現(xiàn)線程之間的通信。
ViewGroup
和View
。ViewGroup
包含onInterceptTouchEvent
、dispatchTouchEvent
、onTouchEvent
三個(gè)相關(guān)事件。View包含dispatchTouchEvent
、onTouchEvent
兩個(gè)相關(guān)事件。其中ViewGroup
又繼承于View。2.ViewGroup
和View組成了一個(gè)樹狀結(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ù),即父類View的dispatchTouchEvent
方法。在所有子View都不處理的情況下,觸發(fā)Acitivity
的onTouchEvent
方法。
7.onInterceptTouchEvent
有兩個(gè)作用:1.攔截Down事件的分發(fā)。2.中止Up和Move事件向目標(biāo)View傳遞,使得目標(biāo)View所在的ViewGroup
捕獲Up和Move事件。
MCP.MVVM項(xiàng)目實(shí)戰(zhàn)代碼.筆記
1.mvc:數(shù)據(jù)、View、Activity,View將操作反饋給Activity,Activitiy去獲取數(shù)據(jù),數(shù)據(jù)通過觀察者模式刷新給View。循環(huán)依賴Activity,很難單元測(cè)試View和Model耦合嚴(yán)重
2.mvp:數(shù)據(jù)、View、Presenter,View將操作給Presenter,Presenter去獲取數(shù)據(jù),數(shù)據(jù)獲取好了返回給Presenter,Presenter去刷新View。PV,PM雙向依賴
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)全能類
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方法的過程,即父View根據(jù)上一步measure子View所得到的布局大小和布局參數(shù),將子View放在合適的位置上。?
第三步:OnDraw():繪制視圖。ViewRoot創(chuàng)建一個(gè)Canvas對(duì)象,然后調(diào)用OnDraw()。
六個(gè)步驟:
①、繪制視圖的背景;
②、保存畫布的圖層(Layer);
③、繪制View的內(nèi)容;
④、繪制View子視圖,如果沒有就不用;
⑤、還原圖層(Layer);⑥、繪制滾動(dòng)條。
P?消耗內(nèi)存小
網(wǎng)絡(luò)傳輸用S?程序內(nèi)使用P
S將數(shù)據(jù)持久化方便
S使用了反射 容易觸發(fā)垃圾回收 比較慢
文章標(biāo)題:如果你在中小廠,這些你一定要搞懂
分享地址:http://muchs.cn/article6/gcecog.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供標(biāo)簽優(yōu)化、網(wǎng)站維護(hù)、關(guān)鍵詞優(yōu)化、微信公眾號(hào)、小程序開發(fā)、網(wǎng)站策劃
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)