2011-08-29 41 views
1

我有一个解析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, ""); 

一切工作正常,但有时新闻提要里有这样的大图。那么,除非你开始旋转手机,否则它们不会造成任何问题。经过几次方向变化之后,我们开心的Out Of Memory异常。

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

无论如何,问题是 - 当他们在WebView中被加载到什么大的图像呢?有没有办法调整它们的尺寸(不仅仅是可视化)?有什么方法可以清除WebView onOrientationChange占用的内存(webview.freeMemory()实际上并没有帮助)。

回答

3

其实,你没有太多的选择。释放内存不会有帮助,因为您的图像仍然分配在内存中,并且图像太大而不适合。

唯一可行的方法是在显示它们(将它们缩小到SD并将它们显示出来之前,从源代码(这种方式无需编程)或下载时间缩小它们的大小本地副本而不是源图像)。

这取决于你是否有在某些时候使用全尺寸的图像。如果没有,保持它们如此之大绝对没有意义。

+0

不幸的是,我不得不使用更大的版本:(当用户点击图片 - 更大的版本弹出窗口花哨的“灯箱”方式 – Sver

+0

在这种情况下,您可以使用SD卡作为“缩小缓冲区”或者在你的网站上创建缩略图,这样画廊会下载缩略图,全尺寸视图会使用原始图像,这可能是最好的方式(但要小心,你可以在全尺寸视图中再次遇到问题,尽管你当时只会显示一张图片) – Shlublu

0

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

我缩小的应用程序,显然这个问题在我的画廊部件的设计。在围绕它的图形界面元素中更具体。即使在夫妇朝向改变之后有空的画廊,我也得到了OOM。

我今天才发现原因。我用/ drawables /文件夹缩小所有图像到mdpi。我测试过的所有电话都是hdpi。显然android使用了一些可能没有如此高效的缩放方法,并且它在某处泄漏。

我搬到了我所有的可绘制到华电国际和MDPI文件夹,并奇迹般地崩溃停止。

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

+0

直接使用res/drawables就足够了 –