Handler系列之記憶體洩漏

2022-05-06 06:21:11 字數 1701 閱讀 8112

本篇簡單的講一下平常使用handler時造成記憶體洩漏的問題。

什麼是記憶體洩漏?大白話講就是分配出去的記憶體,**不回來。嚴重會導致記憶體不足oom。下面來看一下造成記憶體洩漏的**:

public

class memoryleakactivity extends

activity

private

class myhandler extends

handler

@override

public

void

handlemessage(message msg)

}}

上面的**我們不用管傳送訊息、接受訊息,因為之前已經詳細講過了,不是本篇的重點。本篇我想說上面的**會造成記憶體洩漏,什麼意思?handler持有memoryleakactivity引用,為什麼?如果不持有當前類的引用,我怎麼更改當前類的ui或其他邏輯???或者我們知道內部類持有外部類引用也行。那麼怎麼解決那?

解決辦法:將內部類改為靜態內部類,因為靜態內部類不持有外部類引用。由於handler不再持有外部類引用,導致程式不允許你在handler中操作activity中的物件了。所以你還需要在handler中增加乙個對activity的弱引用(使用弱引用的好處在於:activity一旦被置為null,他就會被立刻**)。

上面持有的引用屬於強引用,強引用的特點就是當當前類被**的時候,如果它被強引用所持有,那麼當前類是不會被**的!!!所以我們改成軟引用持有當前類物件,這樣在gc**時會忽略掉弱引用,即就算有弱引用指向某物件,該物件也會在被gc檢查到時**掉。

public

class memoryleakactivity extends

activity

@override

protected

void

onresume()

}@override

protected

void

onpause()

}protected

static

class myhandler extends

handler

@override

public

void

handlemessage(message msg) }}

}

上面**很好的解決了記憶體洩漏的問題。但是這段**可能會在很多介面都會遇到,難道每個介面都需要這樣寫嗎?重複的工作啊,所以乾脆我們抽取成乙個基類,將來建立handler的時候繼承這個基類就好。

public

abstract

class weakhandlerextends

handler

//建立主線程handler使用的構造器

public

weakhandler(t reference)

@override

public

void

handlemessage(message msg)

protected

abstract

void

handlemessage(t t, message message);

}

上述**,我們使用了泛型,這個泛型就是我們之前說的當前類,同時提供了兩種構造器,這樣不管我們是建立主線程還是非主線程handler物件時,都不會造成記憶體洩漏了。

防止handler記憶體洩漏

記憶體洩漏 程式執行會用到記憶體,在退出程式的時候,占用記憶體的資料沒有釋放,那麼當資料越來越多的時候,就會產生記憶體洩漏。handler為什麼會記憶體洩漏呢,handler是個內部類,內部類會持有外部類的引用,內部類需要依賴外部類。handler需要定義為靜態類,當你推出activity,hand...

QT之記憶體洩漏

以入門的hello world 為例 我們將 main.cpp 修改如下 include include intmain int argc,char ar 示例程式我們已經講解完畢。下面再說一點。我們可以將上面的程式改寫成下面的 嗎?include include intmain int argc,...

C 之記憶體洩漏篇

前段時間面試經常被問到記憶體洩漏。今天小總結一下 記憶體洩漏的發生是由於使用者在堆上分配了空間,但卻沒有釋放它。持續的記憶體洩漏最終將導致堆的耗盡,後繼的記憶體分配將會失敗。引發記憶體洩漏的原因是用new分配的記憶體沒有用delete釋放掉。如 可能在onpaint這樣的繪畫視窗的函式中分配了空間,...