一惯退,性能優(yōu)化:
1:優(yōu)化Dalvik虛擬機(jī)的堆內(nèi)存荆萤。(此方法在2.2以上版本不再提供)
float TARGET_HEAP_UTILIZATION = 0.75f;
在程序onCreate時(shí)就可以調(diào)用
VMRuntime.getRuntime().setTargetHeapUtilization(TARGET_HEAP_UTILIZATION);
此方法可以增強(qiáng)程序堆內(nèi)存的處理效率斯棒。
2:強(qiáng)制定義自己軟件的堆內(nèi)存大小(此方法在2.2以上版本不再提供)
private final static int CWJ_HEAP_SIZE = 6* 1024* 1024;
VMRuntime.getRuntime().setMinimumHeapSize(CWJ_HEAP_SIZE);//設(shè)置最小heap內(nèi)存為6MB大小
3玉吁,圖片處理
BitmapFactory.Options options =new BitmapFactory.Options();
options.inSampleSize =2;//圖片寬高都為原來(lái)的二分之一剿涮,即圖片為原來(lái)的四分之一
Bitmap bitmap = BitmapFactory.decodeStream(cr.openInputStream(uri),null, options);
bitmap.recycle(); //回收釋放內(nèi)存
4:UI優(yōu)化
1)言津,盡量利用系統(tǒng)定義的id 比如:android:id="@android:id/list" //可以減少內(nèi)存的使用,又可以減少部分工作量取试,也可以縮減程序安裝包的大小
2)悬槽,盡量使用android系統(tǒng)的圖片資源
android:icon="@*android:drawable/ic_menu_attachment"(注意這里的*不能省略,因?yàn)锳ndroid中沒(méi)有公開(kāi)的圖片資源瞬浓,在xml中直接應(yīng)用會(huì)報(bào)錯(cuò))
3)初婆,盡量使用android的字符串資源
android:text="@android:string/yes" android:text="@android:string/no"這樣既節(jié)省空間,而且直接支持字符串國(guó)際化。
4)磅叛,使用系統(tǒng)的Style
android:textAppearance="?android:attr/textAppearanceMedium"
5)屑咳,使用系統(tǒng)的顏色資源
android:background ="@android:color/transparent"
Android系統(tǒng)本身有很多資源在應(yīng)用中都可以直接使用,具體的弊琴,可以進(jìn)入android-sdk的相應(yīng)文件夾中去查看乔宿。例如:可以進(jìn)入$android-sdk$\platforms\android-8\data\res,里面的系統(tǒng)資源就一覽無(wú)余了访雪。
6),重復(fù)的布局用include標(biāo)簽重用Layout
7)掂林,在初始化狀態(tài)下不需要顯示的布局使用ViewStub標(biāo)簽臣缀。
<ViewStub android:id="@+id/stub_import"
android:inflatedId="@+id/panel_import"
android:layout="@layout/progress_overlay"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_gravity="bottom"/>
ViewStub是一個(gè)隱藏的,不占用內(nèi)存空間的視圖對(duì)象泻帮,它可以在運(yùn)行時(shí)延遲加載布局資源文件精置。當(dāng)ViewStub被設(shè)置為可見(jiàn),或者調(diào)用inflate()函數(shù)時(shí)锣杂,才會(huì)真的去加載這個(gè)布局資源文件脂倦。該ViewStub在加載視圖時(shí)會(huì)在父容器中替換它本身。因此元莫,ViewStub會(huì)一直存在于視圖中赖阻,直到調(diào)用setVisibility(int)或者inflate()為止。ViewStub的布局參數(shù)會(huì)隨著加載的視圖數(shù)一同被添加到ViewStub父容器踱蠢。同樣火欧,也可以通過(guò)使用inflated Id屬性來(lái)定義或重命名要加載的視圖對(duì)象的Id值。
8)茎截,在編寫布局時(shí)苇侵,盡量少的重疊背景,過(guò)多的背景顏色重疊會(huì)導(dǎo)致過(guò)度繪制(Overdraw影響性能)企锌。比如某個(gè)Activity有一個(gè)背景榆浓,然后里面 的Layout又有自己的背景,同時(shí)子View又分別有自己的背景撕攒。
二陡鹃,代碼優(yōu)化
1,注意靜態(tài)變量的使用打却。
在代碼優(yōu)化的過(guò)程中杉适,我們需要對(duì)代碼中的靜態(tài)變量特別留意。靜態(tài)變量是類相關(guān)的變量柳击,它的生命周期是從這個(gè)類被聲明猿推,到這個(gè)類徹底被垃圾回收器回收才會(huì)被銷毀。所以,一般情況下蹬叭,靜態(tài)變量從所在的類被使用開(kāi)始就要一直占用著內(nèi)存空間藕咏,直到程序退出。如果不注意秽五,靜態(tài)變量引用了占用大量?jī)?nèi)存的資源孽查,造成垃圾回收器無(wú)法對(duì)內(nèi)存進(jìn)行回收,就可能造成內(nèi)存的浪費(fèi)坦喘。
2盲再,資源及時(shí)回收,比如cursor.close(); bitmap.recycle();
3瓣铣,程序中為了滿足需求必須使用Context時(shí) 盡量使用Application Context答朋,因?yàn)锳pplication Context的生命周期比較長(zhǎng),應(yīng)用他不會(huì)導(dǎo)致內(nèi)存泄露棠笑。
4梦碗,在ListView中不要使用線程,因?yàn)榫€程的生命周期不可控蓖救。
5洪规,在比較占用內(nèi)存的地方,比如圖片的使用循捺,盡量使用軟應(yīng)用和弱應(yīng)用斩例。
定義一個(gè)HashMap ,保存軟應(yīng)用對(duì)象
private Map<String,SoftRefrence<Bitmap>> imageCache = new HashMap<String,SoftRefrence<Bitmap>>();
再來(lái)定義一個(gè)方法,保存Bitmap的軟應(yīng)用到HashMap巨柒;
public void addBitmapToCache(String path) {
// 強(qiáng)引用的Bitmap對(duì)象
Bitmap bitmap = BitmapFactory.decodeFile(path);
// 軟引用的Bitmap對(duì)象
SoftReference softBitmap =new SoftReference(bitmap);
// 添加該對(duì)象到Map中使其緩存
imageCache.put(path, softBitmap);
}
獲取的時(shí)候樱拴,可以通過(guò)SoftReference的get()方法得到Bitmap對(duì)象
public Bitmap getBitmapByPath(String path) {
// 從緩存中取軟引用的Bitmap對(duì)象
SoftReference softBitmap = imageCache.get(path);
// 判斷是否存在軟引用
if(softBitmap ==null) {
return null;
}
// 取出Bitmap對(duì)象,如果由于內(nèi)存不足Bitmap被回收洋满,將取得空
Bitmap bitmap = softBitmap.get();
return bitmap;
}
使用軟引用以后晶乔,在OutOfMemory異常發(fā)生之前,這些緩存的圖片資源的內(nèi)存空間可以被釋放掉的,從而避免內(nèi)存達(dá)到上限,避免Crash發(fā)生哥攘。