Android WebView内存泄漏的坑

现象描述

在H5接入一个自动播放声音的页面后,承载H5页面的Activity在finish后声音依旧在后台播放,无法停止,只有结束App进程或者在另外的地方获取系统音频焦点使得webview播放的声音失去音频焦点声音才停止播放。

排查步骤

  1. Chrome中使用chrome://inspect链接ADB设备调试
  2. finish承载H5页面的Activity
  3. Chrome中观察到H5页面依旧保留,并没有进行内存回收

解决方案

这个问题很明确——WebView所在的Activity被finish掉后对应webview没有被GC回收。
所以应该在finish对应Activity时主动回收WebView。
但不能简单粗暴在Activity中的onDestory方法中来回收webview,如下:

1
2
3
4
5
6
7
8
 
protected void ()
{
if (webView!= null)
{
webView.destroy();
}
}

这样会导致的问题是,当Activity执行onDestory时,可能内部的webview还依附在父类控件中,那么当这个问题成立的时候,就会抛出以下异常,导致程序停止运行:
Error: WebView.destroy() called while still attached

所以这个问题的正确解决方案应该是在Activity中的onDetachedFromWindow方法中进行处理,处理方案如下:

1
2
3
4
5

public void onDetachedFromWindow() {
super.onDetachedFromWindow();
webView.destroy();
}

原文:大专栏  Android WebView内存泄漏的坑


猜你喜欢

转载自www.cnblogs.com/chinatrump/p/11606400.html