最近看了一些資料,對android的程序的內存有一些想法,我提出來,請你們指正,目的是拋磚引玉。html
首先提幾個有意思的問題:android
1,若是activty destroy掉的話,那麼這個activty內的view所引用的bitmap回收掉了嗎?緩存
2,若是activty destroy掉的話,那麼這個acitity所佔用的內存被GC回收了嗎?app
我覺的一個程序中佔用內存的地方有兩個方面:一個是bimap。一個是context(activity).ide
一,先說bitmap:這個引發內存溢出比較廣泛。有2個解決方法:工具
1,用bitmap的recycle方法,在咱們確認這個bitmap不被使用的時候調用這個方法能夠直接把bitmap所佔用的內存回收掉。不過這個方法的使用的弱點是:若是這個方法調用的時間點不合理,很容易引發 use a recycle bitmap的異常。ui
2,用弱引用來管理你的bitmap。具體方法,是把程序裏全部的bitmap對象放到一個靜態的hasmap中,用弱引用來保 存。若是再用到這個bitmap的時候,根據相應的key直接取出來,至關於一個高速緩存池。保證這個程序不會重複建立過多的bitmap對象。此外弱引用對象能夠在系統內存不足的時候自動被系統回收。this
3,設置壓縮參數,對bitmap進行壓縮。以及用反射設置一下bitmap所佔內存的位置(聽說能夠不算到heap中)。url
二, 再說說context: TextView label = new TextView(this); 你們常常這樣建立view,這意味着,TextView 擁有對整個Activity的引用以及Activity自身擁有的全部內容;通常是整個的View層次和它的全部資源。所以,若是你「泄露」了Context(「泄露」指你保留了一個引用,阻止了GC的垃圾回收),,你將泄露不少的內存。若是你不夠仔細的話,很容易就能泄露一個Activity 。 當一個Drawable附加到一個View上時,View會將其做爲一個callback設定到Drawable上。 因此:用activity這個context傳到view的setbackground中,其實就把這個acitity 「泄漏」了,因此有時候咱們destroy掉了這個activity,可是咱們用內存分析工具查看內存的時候,奇怪的發現這個activity並無沒gc回收掉。要避免這個問題有兩個解決方法:spa
1,不用activity的context 而是用application的context,這樣acitity能夠適時的被系統回收掉。
2,在acitity destroy 方法中 解除activity和biamap(drawble) 的綁定關係。去除bitmap對activity 引用的保留,讓系統適時的去回收。
具體代碼爲
@Override
protected
void
onDestroy() {
super
.onDestroy();
unbindDrawables(findViewById(R.id.RootView));
//
System.gc();
}
private
void
unbindDrawables(View view) {
if
(view.getBackground() !=
null
) {
view.getBackground().setCallback(
null
);
}
if
(view
instanceof
ViewGroup) {
for
(
int
i =
0
; i < ((ViewGroup) view).getChildCount(); i++) {
unbindDrawables(((ViewGroup) view).getChildAt(i));
}
((ViewGroup) view).removeAllViews();
}
}
說了這麼多哈哈,你覺的我說的對不?
參考資料:http://developer.android.com/resources/articles/avoiding-memory-leaks.html