1.Dalvik和ART
Dalvik:應(yīng)用每次運行的時候陨晶,字節(jié)碼都需要通過即時編輯器轉(zhuǎn)換為機器碼。
Android Runtime(ART):應(yīng)用第一次安裝,字節(jié)碼就會預(yù)先編譯成機器碼溃睹,使其成為真正的本地應(yīng)用。這個過程叫預(yù)編譯“預(yù)編譯”Dalvik VM:使用jdk把Java源代碼編譯成.class文件胰坟,在使用Android提供的DX工具因篇,把.class文件編譯為.dex文件,再對.dex進行優(yōu)化笔横,成為.odex文件竞滓。
2.一個線程是否只有一個Looper?
- 一個線程可以有多個Handler,但有且最多只能有一個Looper對象吹缔,他是一個TreadLocal
- 普通線程可以通過Looper.prepared(); Looper.loop()方法變?yōu)長ooper線程商佑。
3.如何保證一個線程只有一個Looper?
- 使用ThreadLocal厢塘,ThreadLocal可理解為一個本地存儲區(qū)域茶没,一個線程有一個Looper,ThreadLocal會把這個Looper對象存儲在本地晚碾,對其他線程的Looper沒有影響抓半。
4.View動畫,屬性動畫格嘁,幀動畫
- view動畫又稱作補間動畫:定義動畫開始和結(jié)束的兩幀笛求,指定動畫變化的時間和方式。通過平移糕簿,縮放探入,旋轉(zhuǎn)和透明度四種效果結(jié)合成負責(zé)的動畫效果。 translate scale alpha rotate <set></set>
- 幀動畫:通過不停的切換圖片實現(xiàn)動畫效果懂诗。 <animation-list></animation-list>
- 屬相動畫:不停的改變對象的屬性實現(xiàn)動畫效果蜂嗽。
5.Android中的4大引用
- 強引用:使用的內(nèi)存不可被回收,知道out of memory錯誤
- 軟引用:如果一個對象只具有軟引用响禽,那么內(nèi)存空間足夠時徒爹,垃圾回收器不會回收它荚醒;如果內(nèi)存空間不足了芋类,就會回收這些對象的內(nèi)存隆嗅。只要垃圾回收器沒有回收它,該對象就可以被程序使用侯繁。
- 弱引用:當(dāng)一個對象只具有弱引用胖喳,垃圾回收器線程在掃描的過程中,一旦發(fā)現(xiàn)了只具有弱引用的對象贮竟,不管當(dāng)前內(nèi)存空間足夠與否丽焊,都會回收它的內(nèi)存。
- 軟引用和弱引用都可以和一個引用隊列聯(lián)合使用咕别,如果引用的對象被垃圾回收了技健,Java虛擬機就會把這個引用加入到與之關(guān)聯(lián)的引用隊列中。弱引用和軟引用你的根本區(qū)別在于:只具有弱引用的對象擁有更短暫的生命周期惰拱,可能隨時被回收雌贱。而只具有軟引用的對象只有當(dāng)前內(nèi)存不夠的時候才被回收,當(dāng)內(nèi)存足夠的時候偿短,通常不被回收欣孤。
- 虛引用:如果一個對象僅持有虛引用,那么它就和沒有任何引用一樣昔逗,在任何時候都可能被垃圾回收降传。虛引用主要用來跟蹤對象被垃圾回收的活動。虛引用必須和引用隊列聯(lián)合使用勾怒。
6.內(nèi)存優(yōu)化如何做婆排?
- 取消手動注冊的監(jiān)聽器:網(wǎng)絡(luò)監(jiān)聽器,廣播接收器笔链,手機狀態(tài)接收器等各種監(jiān)聽器段只。
- 集合中對象沒有清理造成的內(nèi)存泄漏:及時清理集合中的對象。ArrayList
- 資源對象沒有關(guān)閉造成內(nèi)存泄漏:做文件File的輸入卡乾、輸出流的時候翼悴,及時close文件資源,做數(shù)據(jù)庫處理用到了Cursor需要及時關(guān)閉幔妨。
- Bitmap沒有recycle()鹦赎,在自定義View的時候,通常會加載xml中的資源误堡,加載完后要recycle().
- 構(gòu)造Adapter時古话,沒有用ViewHolder對converView進行處理。
- 在自定義View時锁施,在onDraw方法中最好不要創(chuàng)建臨時變量陪踩,需要的變量盡量都創(chuàng)建為全局變量杖们,因為onDraw()方法會被重復(fù)多次的調(diào)用,在onDraw()中創(chuàng)建臨時變量肩狂,會導(dǎo)致系統(tǒng)瞬間產(chǎn)生大量的臨時對象摘完,系統(tǒng)內(nèi)存的開銷瞬間加大,增加了內(nèi)存壓力傻谁。