當前位置:編程學習大全網 - 行動軟體 - android 內存泄露 會導致什麽問題

android 內存泄露 會導致什麽問題

1. 查詢數據庫而沒有關閉Cursor

在Android中,Cursor是很常用的壹個對象,但在寫代碼是,經常會有人忘記調用close, 或者因為代碼邏輯問題狀況導致close未被調用。

通常,在Activity中,我們可以調用startManagingCursor或直接使用managedQuery讓Activity自動管理Cursor對象。

但需要註意的是,當Activity介紹後,Cursor將不再可用!

若操作Cursor的代碼和UI不同步(如後臺線程),那沒需要先判斷Activity是否已經結束,或者在調用OnDestroy前,先等待後臺線程結束。

除此之外,以下也是比較常見的Cursor不會被關閉的情況:

雖然表面看起來,Cursor.close()已經被調用,但若出現異常,將會跳過close(),從而導致內存泄露。

所以,我們的代碼應該以如下的方式編寫:

Cursor c = queryCursor();

try {

int a = c.getInt(1);

......

} catch (Exception e) {

} finally {

c.close(); //在finally中調用close(), 保證其壹定會被調用

}

try {

Cursor c = queryCursor();

int a = c.getInt(1);

......

c.close();

} catch (Exception e) {

}

2. 調用registerReceiver後未調用unregisterReceiver().

在調用registerReceiver後,若未調用unregisterReceiver,其所占的內存是相當大的。

而我們經常可以看到類似於如下的代碼:

這是個很嚴重的錯誤,因為它會導致BroadcastReceiver不會被unregister而導致內存泄露。

registerReceiver(new BroadcastReceiver() {

...

}, filter); ...

3. 未關閉InputStream/OutputStream

在使用文件或者訪問網絡資源時,使用了InputStream/OutputStream也會導致內存泄露

4. Bitmap使用後未調用recycle()

根據SDK的描述,調用recycle並不是必須的。但在實際使用時,Bitmap占用的內存是很大的,所以當我們不再使用時,盡量調用recycle()以釋放資源。

5. Context泄露

這是壹個很隱晦的內存泄露的情況。

先讓我們看壹下以下代碼:

在這段代碼中,我們使用了壹個static的Drawable對象。

這通常發生在我們需要經常調用壹個Drawable,而其加載又比較耗時,不希望每次加載Activity都去創建這個Drawable的情況。

此時,使用static無疑是最快的代碼編寫方式,但是其也非常的糟糕。

當壹個Drawable被附加到View時,這個View會被設置為這個Drawable的callback (通過調用Drawable.setCallback()實現)。

這就意味著,這個Drawable擁有壹個TextView的引用,而TextView又擁有壹個Activity的引用。

這就會導致Activity在銷毀後,內存不會被釋放。

private static Drawable sBackground;

@Override

protected void onCreate(Bundle state) {

super.onCreate(state);

TextView label = new TextView(this);

label.setText("Leaks are bad");

if (sBackground == null) {

sBackground = getDrawable(R.drawable.large_bitmap);

}

label.setBackgroundDrawable(sBackground);

setContentView(label);

}

  • 上一篇:這是佛還是菩薩,具體叫什麽?
  • 下一篇:android30是手機版本嗎
  • copyright 2024編程學習大全網