【移動應用開發技術】Android 5.1應用中 WebView出現內存泄漏如何解決_第1頁
【移動應用開發技術】Android 5.1應用中 WebView出現內存泄漏如何解決_第2頁
【移動應用開發技術】Android 5.1應用中 WebView出現內存泄漏如何解決_第3頁
【移動應用開發技術】Android 5.1應用中 WebView出現內存泄漏如何解決_第4頁
免費預覽已結束,剩余1頁可下載查看

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

【移動應用開發技術】Android5.1應用中WebView出現內存泄漏如何解決

今天就跟大家聊聊有關Android5.1應用中WebView出現內存泄漏如何解決,可能很多人都不太了解,為了讓大家更加了解,在下給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。問題背景在排查項目內存泄漏過程中發現了一些由WebView引起的內存泄漏,經過測試發現該部分泄漏只會出現在android5.1及以上的機型。雖然項目使用WebView的場景并不多,但秉承著一個泄漏都不放過的精神,我們肯定要把它給解決了。遇到的問題項目中使用WebView的頁面主要在FAQ頁面,問題也出現在多次進入退出時,發現內存占用大,GC頻繁。使用LeakCanary觀察發現有兩個內存泄漏很頻繁:

我們分析一下這兩個泄漏:從圖一我們可以發現是WebView的ContentViewCore中的成員變量mContainerView引用著AccessibilityManager的mAccessibilityStateChangeListeners導致activity不能被回收造成了泄漏。引用關系:mAccessibilityStateChangeListeners->ContentViewCore->WebView->SettingHelpActivity從圖二可以發現引用關系是:mComponentCallbacks->AwContents->WebView->SettingHelpActivity問題分析我們找找mAccessibilityStateChangeListeners與mComponentCallbacks是在什么時候注冊的,我們先看看mAccessibilityStateChangeListenersAccessibilityManager.java上面這幾個方法是在AccessibilityManager.class中定義的,根據方法調用可以發現在ViewRootImpl初始化會調用addAccessibilityStateChangeListener添加一個listener,然后會在dispatchDetachedFromWindow的時候remove這個listener。既然是有remove的,那為什么會一直引用著呢?我們稍后再分析。我們再看看mComponentCallbacks是在什么時候注冊的Application.java上面這兩個方法是在Application中定義的,根據方法調用可以發現是在Context基類中被調用根據泄漏路徑,難道是AwContents中注冊了mComponentCallbacks未反注冊么?只有看chromium源碼才能知道真正的原因了,好在chromium是開源的,我們在android5.1Chromium源碼中找到我們需要的AwContents(自備梯子),看下在什么時候注冊了AwContents.java在以上兩個方法中我們發現了mComponentCallbacks的蹤影,在onAttachedToWindow的時候調用mContext.registerComponentCallbacks(mComponentCallbacks)進行注冊,在onDetachedFromWindow中反注冊。我們仔細看看onDetachedFromWindow中的代碼會發現如果在onDetachedFromWindow的時候isDestroyed條件成立會直接return,這有可能導致無法執行mContext.unregisterComponentCallbacks(mComponentCallbacks);也就會導致我們第一個泄漏,因為onDetachedFromWindow無法正常流程執行完也就不會調用ViewRootImp的dispatchDetachedFromWindow方法,那我們找下這個條件什么時候會為true發現是在destroy中設置為true的,也就是說執行了destroy()就會導致無法反注冊。我們一般在activity中使用webview時會在onDestroy方法中調用mWebView.destroy();來釋放webview。根據源碼可以知道如果在onDetachedFromWindow之前調用了destroy那就肯定會無法正常反注冊了,也就會導致內存泄漏。問題的解決我們知道了原因后,解決就比較容易了,就是在銷毀webview前一定要onDetachedFromWindow,我們先將webview從它的父view中移除再調用destroy方法,代碼如下:還有個問題,就是為什么在5.1以下的機型不會內存泄漏呢,我們看下4.4的源碼AwContents我們可以看到在onDetachedFromWindow方法上是沒有

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論