【问题标题】:Send large data OkHttp3 outofmemory发送大数据 OkHttp3 内存不足
【发布时间】:2019-05-30 19:46:56
【问题描述】:

我想将 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。

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

但它也失败了。

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

【问题讨论】:

    标签: android xml post okhttp


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2023-03-09
      • 2016-12-23
      • 2012-03-15
      • 2016-08-15
      • 1970-01-01
      • 2017-10-05
      • 1970-01-01
      • 2014-08-02
      • 1970-01-01
      相关资源
      最近更新 更多