Android App 記憶體洩露之Thread

2021-06-27 07:40:29 字數 2387 閱讀 3540

執行緒也是造成記憶體洩露的乙個重要的源頭。執行緒產生記憶體洩露的主要原因在於執行緒生命週期的不可控。

[html]view plain

copy

<

span

style

="white-space:pre"

>

span

>

/**  

*   

* @version 1.0.0   

* @author abay zhuang <

br/>

*         create at 2014-7-17  

*/  

public class threadactivity extends activity   

private class mythread extends thread   

}  private void dosomthing()  

}  

這段**很平常也很簡單,是我們經常使用的形式。
我們思考乙個問題:假設

mythread

的run

函式是乙個很費時的操作,當我們開啟該執行緒後,將裝置的橫屏變為了豎屏,

一般情況下當螢幕轉換時會重新建立

activity

,按照我們的想法,老的

activity

應該會被銷毀才對,然而事實上並非如此。

由於我們的執行緒是

activity

的內部類,所以

mythread

中儲存了

activity

的乙個引用,當

mythread

的run

函式沒有結束時,

mythread

是不會被銷毀的,因此它所引用的老的

activity

也不會被銷毀,因此就出現了記憶體洩露的問題。

靜態內部類:切斷activity 對於 mythread的強引用。

弱引用: 切斷mythread對於activity 的強引用。

有些人喜歡用

android

提供的asynctask

,但事實上

asynctask

的問題更加嚴重,

thread

只有在run

函式不結束時才出現這種記憶體洩露問題,然而

asynctask

內部的實現機制是運用了

threadpoolexcutor

,該類產生的

thread

物件的生命週期是不確定的,是應用程式無法控制的,

因此如果

asynctask

作為activity

的內部類,就更容易出現記憶體洩露的問題。

**如下:

[html]view plain

copy

/**  

*   

* 弱引用  

* @version 1.0.0   

* @author abay zhuang <

br/>

*         create at 2014-7-17  

*/  

public abstract class weakasynctask<

params

, progress, result, weaktarget

>

extends asynctask<

params

, progress, result

>

@override  

protected final void onpreexecute()   

}  @override  

protected final result doinbackground(params... params)  else   

}  @override  

protected final void onpostexecute(result result)   

}  protected void onpreexecute(weaktarget target)   

protected abstract result doinbackground(weaktarget target,  

params... params);  

protected void onpostexecute(weaktarget target, result result)   

}  

Android App 記憶體洩露之Thread

執行緒也是造成記憶體洩露的乙個重要的源頭。執行緒產生記憶體洩露的主要原因在於執行緒生命週期的不可控。html view plain copy span style white space pre span version 1.0.0 author abay zhuang br create at 2...

AndroidApp定位和規避記憶體洩露方法研究

怎樣避免記憶體洩露 使用procrank檢視程序記憶體 procrank 命令可以獲得當前系統中各程序的記憶體使用快照,這裡有pss,uss,vss,rss。我們一般觀察uss來反映乙個process的記憶體使用情況,uss 的大小代表了只屬於本程序正在使用的記憶體大小,這些內存在此process被...

STL之防止記憶體洩露

可以自由分配和釋放記憶體造就了c 的靈活和強大,但這也是使用c 最容易出現問題的地方,記憶體洩露問題,估計程式猿都會或多或少的遇到,也遭受了很多程式猿們的深惡痛絕,無數個加班的晚上可能就是因為少了乙個delete的緣故。用過c 的人基本上都應該會了較過乙個叫stl 標準模板庫 的東西,這個東西在一定...