5

在我的应用程序中有两个活动,即 A 和 B。

活动一:

它有一个列表,简要显示有关项目的信息。单击 A 上的项目时,它会加载 Activity B。

活动 B:

它有两个网页视图和几个列表视图。活动的顶部被标题 Web 视图占据。活动的下部有选项卡主机,它在第一个选项卡中托管第二个 Web 视图,其余选项卡每个都托管一个列表视图。

问题:

当用户从 A 导航到 B 时,堆大小显着增加。即使在我从 B 导航回 A 之后,堆大小仍然保持不变。甚至没有减少一个字节,实际上它有时会增加。是的,因为这些网络视图。我已经阅读了关于 SO 和其他网站上的 web 视图内存泄漏的信息。我按照这里提到的方法

  1. 在容器[RelativeLayout] 内动态添加 Web 视图。删除了 onDestroy 活动的 webview
  2. SO文章中建议的子类Web视图
  3. 每次清除 Web 视图缓存等

无论堆大小如何,都不会回到导航到 B 之前的状态。

如果有人能指导我解决可能的问题,我真的很感激

笔记:

我已经阅读了这个并在 SO 上关注了这个问题。 WebView 中的内存泄漏

编辑:

我试过在 B 中不使用 web 视图,堆大小的增加非常少,大约 0.5 MB,但是使用 web 视图时,它会增加 4-5 MB

堆大小日志(通过此处提到的以下建议获得)

onCreate B
debug.heap native: allocated 4.11MB of 4.17MB (0.01MB free) in []    
debug.memory: allocated: 12.00MB of 96.00MB (1.00MB free)


onDestroy B
debug.heap native: allocated 8.66MB of 10.08MB (0.48MB free) in []    
debug.memory: allocated: 12.00MB of 96.00MB (1.00MB free)

on Resume A    
debug.heap native: allocated 7.94MB of 10.08MB (1.32MB free) in []
debug.memory: allocated: 12.00MB of 96.00MB (0.00MB free)

我通过在 B 启动和销毁之前和之后进行堆转储来交叉检查数字,堆大小非常接近我在日志中得到的大小

4

1 回答 1

15

我遵循了一系列步骤并减少了内存占用。这就是我所做的,而不是通过 xml 静态创建 webview,我现在以编程方式创建 webview 并将其添加到容器中。一旦不再需要 webview,我就从容器中删除 webview,然后从 webview 中删除所有视图并调用 destroy 。最终分配的内存减少。

private void releaseWebView() {

    webViewContainerRelView.removeAllViews();
        if(mWebView != null){
            mWebView.setTag(null);          
            mWebView.clearHistory();
            mWebView.removeAllViews();          
            mWebView.clearView();
            mWebView.destroy();
            mWebView = null;
        }
}

我从 Activity 的 onDetachedFromWindow 方法调用 releaseWebView() ,如下所示。

@Override
public void onDetachedFromWindow() {
    super.onDetachedFromWindow();
    releaseWebViews();
}
于 2013-11-15T18:54:04.240 回答