android - 发送大数据 OkHttp3 内存不足

标签 android xml post okhttp

我想将 PDF 图像发送到 Android 中的服务器。

服务器规范需要我应该使用 Base64 编码。

所以我应该将 PDF 图像文件转换为 Base64 字符串。

下面是 HTTP POST 请求:

<?xml version="1.0" encoding="UTF-8"?>
<request>
    <auth>
        <!-- auth info -->
    </auth>
    <imagefile>
        <filename>Test Attachment</filename>
        <type>pdf</type>
        <data>"HERE IS BASE64 String"</data>
    </imagefile>
</request>

我使用了下面的代码,它只是 Http post 请求代码。

fun post(url: String, xml: String) = Observable.defer {
    val request = Request.Builder()
            .url(url)
            .post(RequestBody.create(contentType, xml))
            .build()

    okHttpClient.newCall(request).execute()
}

对于较小的 pdf 文件,没问题。 (效果很好)

但是当我使用较大的pdf文件(超过20MB)时,会出现内存不足的情况。

所以我尝试了另一种方法,如下所示。

fun post(url: String, xmlFile: File) = Observable.defer {
    val request = Request.Builder()
            .url(url)
            .post(RequestBody.create(contentType, xmlFile))
            .build()

    okHttpClient.newCall(request).execute()
}

不同的是我不使用String,而是使用File。

我使用 Base64 编码文本和 XML 语法创建了一个文件。

但是也失败了。

如何在Android中发送大数据而不发生OOM?

最佳答案

您将需要找到一个流式 Base64 编码器,并使用它来编写流式传输到服务器的 RequestBody。 OkHttp 或 Okio 中没有内置这样的编码器,但您可以使用 Android 本身中的编码器。对您将在自定义 RequestBody 的 writeTo 方法中获得的 OutputStream 使用 wrap。

https://developer.android.com/reference/java/util/Base64.Encoder

关于android - 发送大数据 OkHttp3 内存不足,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54035531/

相关文章:

python - 使用 Python : concise non-pycurl examples? 的 HTTP POST 二进制文件

iphone - OpenGL ES 中的金属闪光效果?

java - Android教程问题

xml - XSD 断言嵌套元素的属性相等?

java - 从 android 到 PHP 的 HTTP post 调用?

python - 在 Flask 中将表单 POST 对象转换为适合 mongodb 的表示形式

android - 使用线程获取图像资源时, Intent 选择器保持打开状态

android - Robotium waitForFragment

Android:在叠加图像背景中设置填充

python - 从 XML 内容生成静态 HTML 站点