我有一个从服务器加载图片的android应用程序。服务器以XML格式发送base64格式的图像。当我将这个base64解码为字节数组时,我出现内存不足错误。这种情况发生在少数具有较低堆内存的设备上。在这种情况下可以解决什么问题?
else if (this.returnClass == byte[].class) {
if (!xr.isEmptyElementTag()) {
retVal = Base64.decode(xr.nextText(), Base64.NO_WRAP);
System.gc();
xr.nextTag();
}
错误日志说
{05-22 10:19:47.474: D/dalvikvm(2421): GC_FOR_MALLOC freed 0 objects / 0 bytes in 55ms
05-22 10:19:47.474: E/dalvikvm-heap(2421): Out of memory on a 5095368-byte allocation.
05-22 10:19:47.474: I/dalvikvm(2421): "ModernAsyncTask #5" prio=5 tid=14 RUNNABLE
05-22 10:19:47.474: I/dalvikvm(2421): | group="main" sCount=0 dsCount=0 s=N obj=0x4481c6f0 self=0x300de8
05-22 10:19:47.474: I/dalvikvm(2421): | sysTid=2546 nice=10 sched=0/0 cgrp=bg_non_interactive handle=3149608
05-22 10:19:47.474: I/dalvikvm(2421): | schedstat=( 282605471378 64045071861 48652 )
05-22 10:19:47.474: I/dalvikvm(2421): at java.nio.HeapByteBuffer.<init>(HeapByteBuffer.java:~45)
05-22 10:19:47.474: I/dalvikvm(2421): at java.nio.ReadWriteHeapByteBuffer.<init>(ReadWriteHeapByteBuffer.java:47)
05-22 10:19:47.474: I/dalvikvm(2421): at java.nio.BufferFactory.newByteBuffer(BufferFactory.java:49)
05-22 10:19:47.474: I/dalvikvm(2421): at java.nio.ByteBuffer.allocate(ByteBuffer.java:52)
05-22 10:19:47.474: I/dalvikvm(2421): at java.nio.charset.CharsetEncoder.encode(CharsetEncoder.java:317)
05-22 10:19:47.474: I/dalvikvm(2421): at java.nio.charset.Charset.encode(Charset.java:692)
05-22 10:19:47.474: I/dalvikvm(2421): at java.lang.String.getBytes(String.java:903)
05-22 10:19:47.474: I/dalvikvm(2421): at android.util.Base64.decode(Base64.java:118)}
答案 0 :(得分:0)
听起来你需要对图像进行缩减采样,因为你需要对它们进行下载。关于S / O的帖子有很多,例如this one here。只需四处寻找,你就能找到你需要的东西。
另一个提示 - 将URL保存到图像中,只显示/下载您需要的图像。这样可以节省大量内存,并且可以在以后需要时轻松获取图像。