使用Base64将Android映像上传/下载到JSON会导致内存不足错误

The*_*nny 11 base64 android image gson android-volley

我目前编码和解码图像到Base64.我通过使用流将图像编码为字符串来克服OOM的初始问题.

我现在的问题是我无法理解如何通过Gson将多个分辨率图像(5620 x 3747 - 4.92MB或3264 x 1836 - 1.35MB)的多个Base64编码字符串添加到JSON对象.目前Gson仅使用来自5312 x 2988 - 4.95 MB映像的2个Base64字符串抛出OOM异常.

我知道android可能只能为每个应用程序节省16/20Mb,因此这种转换必须超过限制.

如何将流中的Base64字符串写入JSON对象,该对象将包含发布到我的服务器所需的特定值?

是否更容易更改我的服务器以接受多部件请求而不是基于JSON的POJO与多个Base64字符串?我目前使用的是Volley,并没有官方的多部分请求以及IO流.

如果是压缩问题,在编码到Base64字符串之前,我应该对图像应用多少压缩?理想情况下,我希望失去任何质量但具有最佳压缩级别.

更多信息

我正在上传多个不同分辨率的图像,因为它是兼容性的测试.例如,我发送的所有图像都是在低分辨率和极高分辨率的设备上拍摄的,因为我的应用依赖于这些图像的功能.我试图证明我的应用程序可以处理任何图像(在某种程度上,主要是在移动设备上捕获的图像).

我知道有些图像可能太大,以至于将它们加载到内存中会导致异常.这是我稍后会尝试处理的.

在某些情况下,将上传的图像可以从1到200.

我正在努力寻找能够很好地扩展的最佳解决方案.

The*_*nny 2

我研究了使用 Volley 作为将大型 JSON 对象传输到服务器的机制,并找到了这个答案。这个答案本质上证明了 Volley 对于我想要的东西来说不是一个好主意。

我切换到OkHttp,现在使用他们的流方法,允许将 JSON 流式传输到服务器,然后使用简化的方法读取响应。我使用 GSON 库来解析响应,因为 OKHttp 允许将响应 JSON/对象流式传输到读取器对象中,然后 Gson 使用该对象进行内部流式传输并解析为 POJO 类。

我没有切换到多部分请求的唯一原因是服务器端实现是严格的且不可更改以覆盖多部分请求,它严格期望数据和文件的 JSON 表示形式。

对于在 Android 上处理 Base64 图像,我强烈建议不要使用String表示形式,而仅转换为字节,以节省使用过多的内存。我读了这篇关于内存使用和管理的文章String。使用字节,您可以轻松传输数据,而不会在内存中留下大量足迹。

为了显示图像,我仍然通过使用图像库Glide来避免字节到字符串的转换。它们让你可以通过一个byte[]非常方便的地方。