摘要:利用存棧的方式來所有這個(gè)方法目前來看是對(duì)我直接有效的,但是實(shí)際運(yùn)行過程中,會(huì)報(bào)內(nèi)存泄漏的異常,原因是我的會(huì)對(duì)每一個(gè)啟動(dòng)時(shí)進(jìn)行添加,而當(dāng)我某個(gè)時(shí),里對(duì)應(yīng)的無法被,這樣導(dǎo)致我的內(nèi)存開銷增加了。原文地址使用解決存棧的內(nèi)存泄漏問題我的博客時(shí)空路由器
當(dāng) Android 想要退出應(yīng)用時(shí),我們總是希望完全退出。但是 Android 并沒有提供一個(gè)完全退出 App 的函數(shù)。
Google 上搜索了一下,方法有很多,但是基本都是只退出了當(dāng)前的 Activity, 并沒有完全 finish 所有的 Activity。
利用存 Activity 棧的方式來 finish 所有這個(gè)方法目前來看是對(duì)我直接有效的,但是實(shí)際運(yùn)行過程中, leakcanary 會(huì)報(bào)內(nèi)存泄漏的異常,原因是我的 List 會(huì)對(duì)每一個(gè) Activity 啟動(dòng)時(shí)進(jìn)行添加,而當(dāng)我 finish 某個(gè) activity 時(shí),List 里對(duì)應(yīng)的 Activity 無法被 GC,這樣導(dǎo)致我的內(nèi)存開銷增加了。如果我對(duì)每一次 Activity 的 finish 之后再清除對(duì)應(yīng)的 List 里的 Activity, 這樣我覺得會(huì)很麻煩,一點(diǎn)都不優(yōu)雅。下面介紹一下 SoftReference 對(duì)象。
SoftReference,即“軟引用”,由垃圾收集器根據(jù)內(nèi)存需求自行清除。假設(shè)垃圾收集器在某個(gè)時(shí)間點(diǎn)確定對(duì)象是可以輕松訪問的。那時(shí)候,它可能會(huì)選擇原子地清除對(duì)該對(duì)象的所有軟引用,以及對(duì)任何其他可輕松訪問的對(duì)象的所有軟引用,通過一個(gè)強(qiáng)引用鏈可以從該對(duì)象到達(dá)該對(duì)象。在同一時(shí)間或稍后的時(shí)間,它將排入在引用隊(duì)列中注冊(cè)的新清除的軟引用。在虛擬機(jī)拋出OutOfMemoryError之前,所有對(duì)軟到達(dá)對(duì)象的軟引用都保證被清除。否則,在清除軟引用的時(shí)間或者對(duì)一組對(duì)不同對(duì)象的引用將被清除的順序沒有約束。但是,鼓勵(lì)虛擬機(jī)實(shí)現(xiàn)偏離清除最近創(chuàng)建或最近使用的軟引用。
softreference 可以在 Activity 完成生命周期并且沒有其他被引用的情況下被 GC 釋放。所以 List 存 SoftReference 可以解決問題。
繼承一個(gè) Application 類public class MyApp extends Application { private List> activityList = new LinkedList<>(); private static MyApp instance; public static Context context; @Override public void onCreate(){ super.onCreate(); context = getApplicationContext(); LeakCanary.install(this); } public static MyApp getInstance() { if(null == instance) { instance = new MyApp(); } return instance; } //添加 Activity 的軟引用到容器中 public void addActivity(SoftReference softReference) { activityList.add(softReference); } //遍歷所有Activity并finish public void exit(){ for(int i=0;i 添加 Activity 的軟引用 在 BaseActivity 的 onCreate() 方法對(duì)繼承的 Activity 添加軟引用到 MyApp 的 List 里。
MyApp.getInstance().addActivity(new SoftReference<>(this));調(diào)用 exit() 方法當(dāng)需要退出 App 時(shí),只需調(diào)用 MyApp 的 exit() 方法即可。
MyApp.getInstance().exit();原文地址:Android 使用 SoftReference 解決 Activity 存棧的內(nèi)存泄漏問題
我的博客:時(shí)空路由器
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/67557.html
摘要:如果這個(gè)靜態(tài)變量在生命周期結(jié)束后沒有清空,就導(dǎo)致內(nèi)存泄漏。因此造成內(nèi)存泄露。注冊(cè)沒取消造成的內(nèi)存泄露這種的內(nèi)存泄露比純的內(nèi)存泄漏還要嚴(yán)重,因?yàn)槠渌恍┏绦蚩赡芤孟到y(tǒng)的程序的對(duì)象比如注冊(cè)機(jī)制。 原文鏈接 更多教程 為什么會(huì)發(fā)生內(nèi)存泄漏 內(nèi)存空間使用完畢之后未回收, 會(huì)導(dǎo)致內(nèi)存泄漏。有人會(huì)問:Java不是有垃圾自動(dòng)回收機(jī)制么?不幸的是,在Java中仍存在很多容易導(dǎo)致內(nèi)存泄漏的邏輯(...
摘要:騰訊特約作者姚潮生首先以一個(gè)內(nèi)存泄露實(shí)例來開始本節(jié)基礎(chǔ)概念的內(nèi)容。堆內(nèi)存用于存放所有由創(chuàng)建的對(duì)象內(nèi)容包括該對(duì)象其中的所有成員變量和數(shù)組。回到我們的問題,為什么內(nèi)存會(huì)泄露堆內(nèi)存中的長(zhǎng)生命周期的對(duì)象持有短生命周期對(duì)象的強(qiáng)軟引用,盡管 騰訊Bugly特約作者: 姚潮生 首先以一個(gè)內(nèi)存泄露實(shí)例來開始本節(jié)基礎(chǔ)概念的內(nèi)容。 實(shí)例1:?jiǎn)卫龑?dǎo)致內(nèi)存對(duì)象無法釋放而泄露 showImg(http://i....
閱讀 1967·2023-04-26 01:59
閱讀 3274·2021-10-11 11:07
閱讀 3305·2021-09-22 15:43
閱讀 3385·2021-09-02 15:21
閱讀 2563·2021-09-01 10:49
閱讀 910·2019-08-29 15:15
閱讀 3095·2019-08-29 13:59
閱讀 2837·2019-08-26 13:36