0

我正在开发一个显示建筑物平面图的应用程序。平面图是托管在服务器上的 .png 文件。

此代码导致 OutOfMemoryError:

InputStream is = null;
HttpGet httpGet = new HttpGet("http://server/image.png");
HttpClient httpClient = new DefaultHttpClient();
HttpResponse response = httpClient.execute(httpGet);
is = response.getEntity().getContent();

Drawable d = Drawable.createFromStream(is, null); //this line causes an OutOfMemoryException

imageView.setImageDrawable(d);

但是这段代码没有:

InputStream is = assetManager.open("image.png");
Drawable d = Drawable.createFromStream(is, null);
imageView.setImageDrawable(d);

这些图像的尺寸相当大(一个示例为 5100 x 3300),但该图像在线查看时只有约 100 KB,在 .apk 文件中查看时它并没有小很多(约 95 KB)。

有谁知道为什么第一个代码片段会导致错误,而第二个不会?在调试期间,第一个 InputStream 的大小仅为 ~102000 字节,第二个 InputStream 的大小仅为 ~95000 字节。这似乎不足以解释错误的大小差异。

4

1 回答 1

3

可绘制流将为它创建一个可绘制的位图。这意味着它需要将未压缩的完整位图存储在内存中。为此,它需要分配整个内存——5100*3300*4 字节,即 64 MB。这对安卓来说太大了。

从资产开始时,它可能在必须读取文件之前不会读取文件,并且不会创建内存位图。它可以只将文件指针保存在内存中。但是你不能用流来做到这一点,当你开始阅读它时,流可能没有价值,而且你不能多次阅读它(而你可以阅读一个文件)。

于 2013-04-03T20:35:56.280 回答