我已经阅读了100篇关于OOM问题的文章。大多数是关于大位图。我正在做一个地图应用程序,我们下载256x256
天气覆盖图块。大多数是完全透明的,非常小。我刚刚在调用BitmapFactory.decodeByteArray(....).
异常声明:
java.lang.OutOfMemoryError: bitmap size exceeds VM budget(Heap Size=9415KB, Allocated=5192KB, Bitmap Size=23671KB)
代码是:
protected Bitmap retrieveImageData() throws IOException {
URL url = new URL(imageUrl);
InputStream in = null;
OutputStream out = null;
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
// determine the image size and allocate a buffer
int fileSize = connection.getContentLength();
if (fileSize < 0) {
return null;
}
byte[] imageData = new byte[fileSize];
// download the file
//Log.d(LOG_TAG, "fetching image " + imageUrl + " (" + fileSize + ")");
BufferedInputStream istream = new BufferedInputStream(connection.getInputStream());
int bytesRead = 0;
int offset = 0;
while (bytesRead != -1 && offset < fileSize) {
bytesRead = istream.read(imageData, offset, fileSize - offset);
offset += bytesRead;
}
// clean up
istream.close();
connection.disconnect();
Bitmap bitmap = null;
try {
bitmap = BitmapFactory.decodeByteArray(imageData, 0, bytesRead);
} catch (OutOfMemoryError e) {
Log.e("Map", "Tile Loader (241) Out Of Memory Error " + e.getLocalizedMessage());
System.gc();
}
return bitmap;
}
以下是我在调试器中看到的内容:
bytesRead = 442
因此位图数据为442字节。为什么要尝试创建23671KB位图并耗尽内存?
答案 0 :(得分:2)
过去我遇到过这样的问题。 Android使用Bitmap VM,它非常小。确保通过bmp.recycle处理位图。 Android的更高版本有更多的Bitmap VM,但我一直处理的版本有20MB的限制。
答案 1 :(得分:0)
这可能有用。缩小位图以降低质量。我不确定,但这可能会复制内存中的图像,但很容易值得一试。
Bitmap image;
image = BitmapFactory.decodeByteArray(data, 0, data.length);
Bitmap mutableBitmap = image.copy(Bitmap.Config.ARGB_4444, true);
Canvas canvas = new Canvas(mutableBitmap);
我在下面的旧答案我认为不会有流量。
Options options = new BitmapFactory.Options();
Options options2 = new BitmapFactory.Options();
Options options3 = new BitmapFactory.Options();
options.inPreferredConfig = Bitmap.Config.ARGB_8888;///////includes alpha
options2.inPreferredConfig = Bitmap.Config.RGB_565 ;///////no alpha
options3.inPreferredConfig = Bitmap.Config.ARGB_4444 ;/////alpha lesser quality
image=BitmapFactory.decodeResource(getResources(),R.drawable.imagename,options);
image=Bitmap.createScaledBitmap(image, widthx,height, true);
答案 2 :(得分:0)
听起来你已经对这个主题做了一些阅读,所以我将为你省去标准'这就是你如何解码位图'的评论..
我突然想到你可能正在抓住旧位图的参考(也许瓷砖已移出屏幕,但你仍然在某个地方有一个数组的引用,因此它不是垃圾集?)。这在过去让我非常痛苦 - 内存泄漏很难调试。
当我遇到类似的问题时,有一个很棒的Google I/O video over here对我有帮助。大概一个小时左右,但希望能在几天后救你。 它包括以下内容: