【问题标题】:Large images in WebView cause Out Of MemoryWebView 中的大图像导致内存不足
【发布时间】:2011-08-29 07:36:58
【问题描述】:

我有解析 XML 提要(带有新闻)并在 WebView 中加载解析数据(文本和图像 url)的活动,它们位于图库小部件内。

类似这样的:

mimeType = "text/html";

encoding = "utf-8";

String html = "<img src=\""
+ newsImageUrl.get(position)
+ "\" style=\"max-width:200px; max-height:200px;\" align=\"left\""
+ "/>" + newsDescription.get(position);

data.loadDataWithBaseURL("", html, mimeType, encoding, "");

一切正常,但有时在新闻提要中会有这个大图像。好吧,除非您开始旋转手机,否则它们不会引起任何问题。经过几次方向更改后,我们遇到了内存不足异常。

嗯,在 Android 中,OOM 总是隐藏在 Bitmas 附近的某个地方,这就是为什么大多数人将 BitmapFactory 与 inSampleSize 或其他更奇特的东西一起使用。好吧,据说,我可以下载和重新采样图像,然后从 SD 卡中加载它们。但现在我会尽量避免它。

无论如何,问题是——当它们在 WebView 中加载时如何处理大图像?有没有办法调整它们的大小(不仅仅是视觉上)?有没有办法清除 WebView onOrientationChange 占用的内存(webview.freeMemory() 并没有真正帮助)。

【问题讨论】:

    标签: android webview bitmap out-of-memory out


    【解决方案1】:

    其实,你没有那么多选择。释放内存无济于事,因为您的图像仍分配在内存中,而且图像太大而无法容纳。

    唯一可行的方法是减小它们的大小,无论是在源(这样您无需以编程方式执行任何操作)或在下载时,在显示它们之前(将它们按比例缩小到 SD 并显示这些本地副本而不是源图像)。

    这取决于您是否必须在某些时候使用全尺寸图像。如果不是,那么让它们保持这么大是绝对没有意义的。

    【讨论】:

    • 不幸的是,我必须使用更大的版本 :( 当用户点击图像时 - 以花哨的“灯箱”方式弹出更大的版本。
    • 在这种情况下,您可以将 SD 卡用作“缩小缓冲区”,或者在您的网站中创建缩略图。这样,画廊将下载缩略图,而全尺寸视图将使用原始图像。这可能是最好的方法(但请注意,您可能会在使用全尺寸视图时再次遇到问题,尽管当时您只会显示一张图像)
    • @Sver 您是否在灯箱上取得了任何进展,因为我在使用 light-gallery 时遇到了同样的问题,它使用图像缩放。还是我们除了缩小图片别无他法?
    【解决方案2】:

    无论如何,问题不在于 webview 大图像。

    我缩小了应用程序的规模,显然问题出在我的画廊小部件设计中。在围绕它的图形界面元素中更具体。即使在几个方向更改后画廊空无一人,我也得到了 oom。

    我今天才找到原因。我使用 /drawables/ 文件夹将所有图像缩小为 mdpi。我测试过的所有手机都是hdpi。显然 android 使用了一些可能没有那么有效的缩放方法,并且它在某处泄漏。

    我将所有可绘制对象移至 hdpi 和 mdpi 文件夹,然后神奇地停止了崩溃。

    所以,结论 - 避免使用 /drawables/ 文件夹。

    【讨论】:

    • 直接使用res/drawables就够了
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-09
    • 1970-01-01
    • 2017-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-16
    相关资源
    最近更新 更多