【问题标题】:Out of memory error while decoding base64 to byte array?将base64解码为字节数组时出现内存不足错误?
【发布时间】:2013-05-22 16:22:20
【问题描述】:

我有一个从服务器加载图像的 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)}

【问题讨论】:

  • 更多细节:请代码+堆栈跟踪。

标签: android base64 out-of-memory


【解决方案1】:

听起来您只需要在下载图像时对其进行下采样。在 S/O 上有许多关于此的帖子,其中包含 this one here 之类的示例代码。随便看看,你就会找到你需要的。

另一个提示 - 将 URL 保存到图像并仅显示/下载您需要的图像。这样可以节省大量内存,并且可以在以后根据需要轻松获取图像。

【讨论】:

  • 在解码 base64 时无法对图像进行下采样。正确的?我知道一旦我有了字节数组,我就可以使用 BitmapFactory.Options 对其进行下采样
  • 对——你可以像在this example中那样解码
  • 但我的代码甚至没有达到位图解码部分。仅在解码 base64 时崩溃。
  • 您可以发布您的代码的那部分吗?一个 base64 字符串本身会导致 OOM 异常,这很奇怪。
猜你喜欢
  • 2016-07-22
  • 1970-01-01
  • 1970-01-01
  • 2012-03-23
  • 2019-03-08
  • 2016-03-06
  • 2017-01-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多