亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

 更新時間:2020年12月29日 10:13:16   作者:老K的Java博客  
這篇文章主要介紹了Android內存泄漏的原因及解決技巧,幫助大家更好的利用Android進行開發(fā),感興趣的朋友可以了解下

正確的生命周期管理如何防止Android內存泄漏

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

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

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

為什么安卓系統(tǒng)會發(fā)生內存泄漏?

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

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

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

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

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

Android生命周期感知組件

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

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

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

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

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

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

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

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

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

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

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

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

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

interface View: MVPView, LifecycleOwner

class 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是由框架生成的,它附加到創(chuàng)建者的生命周期中(作為一個額外的好處,使用Dagger注入非常容易)

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

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

3. 使用LeakCanary和Bugfender

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

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

我們的遠程日志工具Bugfender允許您調試單個泄漏跟蹤,并擴展一個名為DisplayLeakService的類,它讓我們知道何時發(fā)生泄漏。然后我們就可以用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 源碼淺析RecyclerView ItemAnimator

    Android 源碼淺析RecyclerView ItemAnimator

    這篇文章主要為大家介紹了Android 源碼淺析RecyclerView ItemAnimator,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-12-12
  • Android的Service應用程序組件基本編寫方法

    Android的Service應用程序組件基本編寫方法

    Service是一個android 系統(tǒng)中的應用程序組件,它跟Activity的級別差不多,但是他沒有圖形化界面,不能自己運行,只能后臺運行,Service通常用來處理一些耗時比較長的操作
    2012-12-12
  • Android Handler leak分析及解決辦法詳解

    Android Handler leak分析及解決辦法詳解

    這篇文章主要介紹了Android Handler leak分析及解決辦法詳解的相關資料,需要的朋友可以參考下
    2017-03-03
  • 談談Android6.0運行時的權限處理

    談談Android6.0運行時的權限處理

    之前有人在 Android 6.0 的機型上運行了DragGridView結果出異常奔潰了。想必問題的原因大家都知道,是Android 6.0新引入了在運行時權限申請(Runtime Permissions)的功能。那么這所謂的運行時申請權限究竟是怎么一回事呢,下面跟著小編一起來看看吧!
    2016-08-08
  • Android直播系統(tǒng)平臺搭建之圖片實現陰影效果的方法小結

    Android直播系統(tǒng)平臺搭建之圖片實現陰影效果的方法小結

    這篇文章主要介紹了Android直播系統(tǒng)平臺搭建, 圖片實現陰影效果的若干種方法,本文給大家?guī)砣N方法,每種方法通過實例代碼給大家介紹的非常詳細,需要的朋友可以參考下
    2021-08-08
  • android之HttpPost&HttpGet使用方法介紹

    android之HttpPost&HttpGet使用方法介紹

    下文直接講用法,先知道怎么用,再知道怎么回事,具體如下,感興趣的朋友可以參考下哈
    2013-06-06
  • Android實現固定屏幕顯示的方法

    Android實現固定屏幕顯示的方法

    這篇文章主要介紹了Android實現固定屏幕顯示的方法,實例分析了Android屏幕固定顯示所涉及的相關技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-07-07
  • android實現獲取正在運行的應用程序

    android實現獲取正在運行的應用程序

    android如何獲取正在運行的應用程序,因為在framework中想添加這個功能,所以寫了個appliction來實現一下獲取正在運行的應用程序
    2013-01-01
  • Flutter數字切換動畫實現示例詳解

    Flutter數字切換動畫實現示例詳解

    這篇文章主要為大家介紹了Flutter數字切換動畫實現示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-08-08
  • Android RecyclerView實現多種item布局的方法

    Android RecyclerView實現多種item布局的方法

    本篇文章主要介紹了Android RecyclerView實現多種item布局的方法,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-12-12

最新評論