发送大数据OkHttp3内存不足

时间:2019-01-04 08:39:12

标签: 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文件(超过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。

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

但是它也失败了。

如何在没有OOM的情况下在Android中发送大数据?

1 个答案:

答案 0 :(得分:1)

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

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