Android面試基本繞不開App性能優(yōu)化,在內(nèi)存和App的運行速度上我根據(jù)個人想到的做一個匯總總結(jié)。
不需要再使用的對象被其它對象持有引用,導(dǎo)致該對象所占用的內(nèi)存不能被回收,這就是內(nèi)存泄漏。
一個應(yīng)用內(nèi)的內(nèi)存耗盡,無法為新對象分配內(nèi)存,導(dǎo)致應(yīng)用崩潰,這就是內(nèi)存溢出,典型是加載多張大圖,內(nèi)存泄漏可以造成內(nèi)存溢出后果。
如何解決Bitmap 內(nèi)存溢出?
可以對圖片進行采樣率、RGB565壓縮、尺寸等壓縮法,如有需要可以加入LruCache 對圖片進行緩存管理。
什么情況下會造成內(nèi)存泄漏?
長期保持某些資源,如Context、Cursor、IO流的引用,資源得不到釋放造成內(nèi)存泄露。
1.Context 對象被其它地方引用,沒有被釋放。
2.查詢數(shù)據(jù)庫沒有關(guān)閉cursor 。
3.Adapter沒有復(fù)用convertView,沒有使用 ViewHolder模式。
4.Bitmap 不再使用時 沒有調(diào)用recylce()釋放內(nèi)存。
5.Handler造成的內(nèi)存泄漏
1.不要在UI 線程做耗時操作,導(dǎo)致UI線程卡頓。
2.Layout的層次太多,無法再16ms內(nèi)完成渲染。
3.viewStub 減少過度繪制,使用時再初始化。
4.同一時間做過多的動畫。
Application是自行開發(fā)程序的主入口,特別是很多第三方SDK都會需要在Application的onCreate里面做很多初始化操作。一些第三方框架的sdk能在子線程中初始化則就在子線程中去初始化。
1.布局排版上,如圖片與文字,能利用用TextView屬性就不需要用Layout 包裹ImageView 和TextView 來實現(xiàn), 如直接用TextView的drawableLeft,或者drawableTop
2.Bitmap的內(nèi)存處理,1. 采樣率壓縮: Bitmap在設(shè)置給ImageView的時候,把圖片寬高壓到與ImageView的大小一致2.如果圖片沒有透明的部分優(yōu)先考慮 Config.RGB_565,內(nèi)存直接比默認配置少一半。
3.Fragment盡量使用懶加載的形式,尤其是放在ViewPager 中使用。A—跳到B Activity, 如果B Activity 有ViewPager 加載Fragment,Fragment 有耗時操作就容易出現(xiàn)卡頓,因為B Activity 的onCreated 函數(shù)有耗時操作。
4.可以采用ArrayMap等新的輕型結(jié)構(gòu)代替java 包中的傳統(tǒng)結(jié)構(gòu)類型。
5.可以使用EventBus 代替廣播。
6.大文件操作可以使用nio 中的 FileChannel 配置ByteBuffer 高效率讀寫。
7.application中的某些初始化能放到子線程中的可以放到子線程中進行。
8.多利用AndroidStudio 自帶的Lint 工具,對工程進行分析 inspectCode,自帶內(nèi)存監(jiān)控,也可以使用第三方的內(nèi)存監(jiān)控工具LeakCanary。
以上是目前想到的,以后有補充在陸續(xù)更新修改本文。
聯(lián)系客服