android - WebView 占用太多内存

标签 android android-webview

在我的应用中有两个 Activity,即 A 和 B。

Activity A:

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

Activity B:

它有两个 WebView 和几个 ListView 。 Activity 的顶部被标题网页 View 占据。 Activity 的下半部分有选项卡宿主,它承载第一个选项卡中的第二个 Web View ,其余选项卡每个承载一个 ListView 。

问题:

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

  1. 在容器 [RelativeLayout] 中动态添加 WebView 。删除了关于 Destroy Activity 的 webview
  2. 按照 SO 文章中的建议对 Web View 进行子分类
  3. 每次都清除 WebView 缓存等

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

如果有人能指导我解决问题,我将不胜感激

注意:

我已经阅读了这篇文章并在 SO 上关注了这个问题。 Memory leak in WebView

编辑:

我在 B 中尝试过没有 web views 并且堆大小的增加非常非常少,大约 0.5 MB 但有 web views 它减少了 4-5 MB

堆大小日志(通过以下建议得到 here )

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 启动和销毁之前和之后进行堆转储来交叉检查数字,堆大小非常接近我在日志中得到的大小

最佳答案

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

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();
}

关于android - WebView 占用太多内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17741297/

相关文章:

android - 仅限wifi通讯

javascript - navigator.geolocation.getCurrentPosition() 在 Android 上的 WebView 中永远不会返回

android - 如何在 espresso webview 中选择下拉列表选项

Android WebView - NTLM 身份验证

android - 在线程 'FinalizerDaemon' 上调用了 WebView 方法,但我的应用程序没有 WEBVIEW

android - Android Phonegap 应用程序中的按钮单击事件出错

android - 在 ImageView 上设置负边距会移动 ImageView 而不是 Image

单个 .html 文件上的 Android WebView 给出 “net::ERR_CACHE_MISS”

java - 如何使用xpath检索属性名称中包含冒号的属性值

android - 如何将 android Activity 更改与 adb getevent 命令链接?