电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

Android內存泄漏的原因及解決技巧

瀏覽:98日期:2022-09-21 10:59:33
正確的生命周期管理如何防止Android內存泄漏

OutOfMemoryException是一個常見的令人沮喪的錯誤,也是導致應用程序意外關閉的主要原因之一。

“如果應用程序昨天運行良好,為什么現在會發生這種情況?這個問題讓Android的開發者和新手都感到困惑。

導致OutOfMemory異常的潛在原因有很多種,但其中最常見的是內存泄漏—應用程序中的內存分配從未釋放。本文將解釋如何通過有效的生命周期管理(開發過程中一個重要但經常被忽視的部分)來最小化這種風險。

為什么安卓系統會發生內存泄漏?

問題很簡單。某些對象應該只有一個固定的壽命,當它們的使用壽命結束時,它們需要被刪除。

Android內存泄漏的原因及解決技巧

理論上,當進程使用onStop或onDestroy終止時,應該處理該內存。但是,濫用對象引用可能會阻止垃圾收集器釋放未使用的對象。例如:如果未使用的對象A引用了未使用的對象B,那么您將得到兩個不必要的對象,垃圾回收器將永遠不會釋放它們,因為它們正在相互引用。

阻止內存泄漏這種情況發生的常見技巧

開發人員可以采取許多步驟來阻止死的活動被困在內存中。

在onResume()/onPause()或onStart()/onStop()中注冊/注銷廣播接收器 不要對視圖/活動/上下文使用靜態變量 需要保存對上下文的引用的singleton應該使用applicationContext()或將其包裝到WeakReference中 注意匿名和非靜態內部類,因為它們包含對其封閉類的隱式引用。 如果要比父類(如處理程序)更長壽,請使用靜態內部類而不是匿名類。 如果內部或匿名類是可取消的(如AsyncTask、Thread、RxSubscriptions),則在銷毀活動時取消它。 Android生命周期感知組件

一旦你完成了上面的基本步驟,現在是時候做一些更重要的事情了:應用程序活動的生命周期。如果我們不能正確地管理生命周期,我們最終會在不再需要內存的時候掛掉它。

這涉及到許多不同的任務。對于每個活動,我們需要中斷線程,去掉RxJava中的訂閱,取消AsyncTask引用,并確保正確刪除該活動的引用(以及與之相關的任何其他活動)。所有這些任務都會消耗開發人員的大量時間。

模型視圖呈現器(MVP)使事情變得更加復雜,MVP是Android中構建用戶界面的常用架構模式。然而,MVP對于從視圖中分離業務邏輯非常有用。

在MVP模式中,View和Presenter都是它們之間行為契約的抽象實現。實現MVP最常見的方法是使用活動/片段作為視圖的實現,并為習慣于引用視圖的演示者使用簡單的實現。

所以我們最終得到了一個帶有Presenter引用的視圖和一個帶有視圖引用的Presenter(提示:這里有一個潛在的漏洞)。

考慮到這些潛在的困難,我們有必要建立一個適當的管理結構來移除在生命周期中創建的多余內存。有幾種行之有效的方法可以做到這一點:

1. 在Android Studio上使用Android Arch Lifecycle創建支持生命周期的組件

生命周期感知組件是智能的。例如,它們可以通過除去內存來對另一個組件(如活動或片段)的生命周期狀態的更改作出反應。這意味著代碼更輕,內存效率更高。

archlifecycle是Android的一個新庫,它提供了一組工具來構建支持生命周期的組件。庫以抽象的方式工作,這意味著生命周期所有者不再需要擔心管理特定任務和活動的生命周期。

Arch生命周期的關鍵工具和定義如下:

生命周期:一個排序系統,它定義了哪些對象具有Android生命周期,并允許對它們進行監視。 LifecycleObserver:一個常規接口,它監視每個被標識為具有Android生命周期的對象,使用一個簡單的公式來處理每個密鑰生命周期事件。 @OnLifecycleEvent:可以在實現LifecycleObserver接口的類中使用的注釋。它允許我們設置關鍵生命周期事件,這些事件將在每次啟動時觸發帶注釋的方法。以下是可設置的所有事件的列表:ON_ANY、ON_CREATE、ON_DESTROY、ON_PAUSE、ON_RESUME、ON_START、ON_STOP LifecycleOwner默認為每個可以管理其生命周期的Android組件實現,并讓開發人員控制每個事件。

使用這些工具,我們可以將所有干凈的任務發送給它們的所有者(在我們的例子中是演示者),這樣我們就有了一個干凈的、無泄漏的解耦代碼(至少在演示者層是這樣)。

下面是一個超級基本的實現,向您展示我們所說的:

interface View: MVPView, LifecycleOwnerclass RandomPresenter : Presenter<View>, LifecycleObserver { private lateinit var view: View override fun attachView(view: View) { this.view = view view.lifecycle.addObserver(this) } @OnLifecycleEvent(Lifecycle.Event.On_DESTROY) fun onClear() {//TODO: clean }2. 使用Android架構視圖模型作為演示者和LiveData

另一種方法是通過使用新的生命周期組件來避免視圖模型的內存泄漏。

ViewModel是一個抽象類,它實現一個稱為onClear的函數,當必須刪除某個特定對象時,該函數會自動調用。ViewModel是由框架生成的,它附加到創建者的生命周期中(作為一個額外的好處,使用Dagger注入非常容易)

除了使用ViewModel,LiveData還提供了一個重要的通信渠道。這意味著創造了一個容易觀察到的反應性產物。

這里最重要的一點是,生命周期所有者可以觀察到LiveData,因此數據傳輸總是由生命周期管理的,而且我們可以確保在使用它們時保留任何引用。

3. 使用LeakCanary和Bugfender

Android內存泄漏的原因及解決技巧

除了上述步驟之外,我們還想推薦兩個重要的工具包:LeakCanary,一個用于監視泄漏的流行工具,以及我們自己的Bugfender。

LeakCanary是一個用于Android和Java的內存檢測庫。它是開源的,所以有一個龐大的社區支持它,它不僅僅告訴你一個漏洞,它還告訴你可能的原因。

我們的遠程日志工具Bugfender允許您調試單個泄漏跟蹤,并擴展一個名為DisplayLeakService的類,它讓我們知道何時發生泄漏。然后我們就可以用Bugfender輕松登錄了。

public class LeakUploadService extends DisplayLeakService { override fun afterDefaultHandling(heapDump: HeapDump, result: AnalysisResult, leakInfo: String) { if (result.leakFound) { Bugfender.d(“LeakCanary”, result.toString()) } }}

此外,用戶還可以獲得Bugfender的所有其他好處,包括全天候記錄日志(即使設備離線)、內置故障報告和易于使用的web控制臺。

以上就是Android內存泄漏的原因及解決技巧的詳細內容,更多關于Android內存泄漏的資料請關注好吧啦網其它相關文章!

標簽: Android
相關文章:
主站蜘蛛池模板: 直齿驱动-新型回转驱动和回转支承解决方案提供商-不二传动 | 欧盟ce检测认证_reach检测报告_第三方检测中心-深圳市威腾检验技术有限公司 | 南京技嘉环保科技有限公司-杀菌除臭剂|污水|垃圾|厕所|橡胶厂|化工厂|铸造厂除臭剂 | 低压载波电能表-单相导轨式电能表-华邦电力科技股份有限公司-智能物联网综合管理平台 | 珠光砂保温板-一体化保温板-有釉面发泡陶瓷保温板-杭州一体化建筑材料 | 税筹星_灵活用工平台_企业财务顾问_财税法薪综合服务平台 | 【孔氏陶粒】建筑回填陶粒-南京/合肥/武汉/郑州/重庆/成都/杭州陶粒厂家 | 京马网,京马建站,网站定制,营销型网站建设,东莞建站,东莞网站建设-首页-京马网 | 软文发布-新闻发布推广平台-代写文章-网络广告营销-自助发稿公司媒介星 | 进口试验机价格-进口生物材料试验机-西安卡夫曼测控技术有限公司 | 电液推杆生产厂家|电动推杆|液压推杆-扬州唯升机械有限公司 | 上海刑事律师|刑事辩护律师|专业刑事犯罪辩护律师免费咨询-[尤辰荣]金牌上海刑事律师团队 | 有机废气处理-rto焚烧炉-催化燃烧设备-VOC冷凝回收装置-三梯环境 | 陶瓷砂磨机,盘式砂磨机,棒销式砂磨机-无锡市少宏粉体科技有限公司 | 山东钢衬塑罐_管道_反应釜厂家-淄博富邦滚塑防腐设备科技有限公司 | 【MBA备考网】-2024年工商管理硕士MBA院校/报考条件/培训/考试科目/提前面试/考试/学费-MBA备考网 | 百度网站优化,关键词排名,SEO优化-搜索引擎营销推广 | 蒜肠网-动漫,二次元,COSPLAY,漫展以及收藏型模型,手办,玩具的新媒体.(原变形金刚变迷TF圈) | 专业的压球机生产线及解决方案厂家-河南腾达机械厂 | 苏州注册公司_苏州代理记账_苏州工商注册_苏州代办公司-恒佳财税 | 防渗膜厂家|养殖防渗膜|水产养殖防渗膜-泰安佳路通工程材料有限公司 | 贴片电感_贴片功率电感_贴片绕线电感_深圳市百斯特电子有限公司 贴片电容代理-三星电容-村田电容-风华电容-国巨电容-深圳市昂洋科技有限公司 | 气体检测仪-氢气检测仪-可燃气体传感器-恶臭电子鼻-深国安电子 | 新车测评网_网罗汽车评测资讯_汽车评测门户报道 | HDPE土工膜,复合土工膜,防渗膜价格,土工膜厂家-山东新路通工程材料有限公司 | 无线讲解器-导游讲解器-自助讲解器-分区讲解系统 品牌生产厂家[鹰米讲解-合肥市徽马信息科技有限公司] | 云南成考网_云南成人高考报名网| 武汉不干胶印刷_标签设计印刷_不干胶标签印刷厂 - 武汉不干胶标签印刷厂家 | 不锈钢闸阀_球阀_蝶阀_止回阀_调节阀_截止阀-可拉伐阀门(上海)有限公司 | 附着力促进剂-尼龙处理剂-PP处理剂-金属附着力处理剂-东莞市炅盛塑胶科技有限公司 | Eiafans.com_环评爱好者 环评网|环评论坛|环评报告公示网|竣工环保验收公示网|环保验收报告公示网|环保自主验收公示|环评公示网|环保公示网|注册环评工程师|环境影响评价|环评师|规划环评|环评报告|环评考试网|环评论坛 - Powered by Discuz! | 合肥风管加工厂-安徽螺旋/不锈钢风管-通风管道加工厂家-安徽风之范 | 特种阀门-调节阀门-高温熔盐阀-镍合金截止阀-钛阀门-高温阀门-高性能蝶阀-蒙乃尔合金阀门-福建捷斯特阀门制造有限公司 | 钢衬四氟管道_钢衬四氟直管_聚四氟乙烯衬里管件_聚四氟乙烯衬里管道-沧州汇霖管道科技有限公司 | 高温热泵烘干机,高温烘干热泵,热水设备机组_正旭热泵 | 耙式干燥机_真空耙式干燥机厂家-无锡鹏茂化工装备有限公司 | 上海小程序开发-上海小程序制作公司-上海网站建设-公众号开发运营-软件外包公司-咏熠科技 | 山东彩钢板房,山东彩钢活动房,临沂彩钢房-临沂市贵通钢结构工程有限公司 | 混合气体腐蚀试验箱_盐雾/硫化氢/气体腐蚀试验箱厂家-北京中科博达 | U拓留学雅思一站式服务中心_留学申请_雅思托福培训 | 铝合金重力铸造_铝合金翻砂铸造_铝铸件厂家-东莞市铝得旺五金制品有限公司 |