執行緒也是造成記憶體洩露的乙個重要的源頭。執行緒產生記憶體洩露的主要原因在於執行緒生命週期的不可控。
這段**很平常也很簡單,是我們經常使用的形式。[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 plaincopy
/**
*
* 弱引用
* @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 標準模板庫 的東西,這個東西在一定...