首页 > 解决方案 > 在尝试发送大型 BASE64 时,使用 RX 进行改造会运行 OutOfMemory

问题描述

我想发送一个模型 throw Retrofit,其中包含一些标准字段和文件,以 BASE64 格式编码。我知道,这是一种发送文件的疯狂方式,但我有一个没有后端开发人员的服务器。

因此,例如,当我发送 3 个 20mb 的 pdf 文件时,我的内存不足,像这样的异常

未能分配 30544558 字节分配,其中 2085152 字节和 26MB 直到 OOM

我发现,这是解析base64字符串的问题,我已经在内存中有Json throw GSON。我尝试创建一个自定义适配器,根据Retrofit OutOfMemory 异常,同时将 BASE64 中的文件加载到服务器,但在大型模型的情况下没有想法。将大字符串传递给 JSON 会解决这个问题吗?也许我可以使用其他适配器,而不是 GSON?

Json中文档字段的模型和整个模型

data class Document(
    var base64: MutableList<String?>,
    var mime: String?,
    var name: String?
)

data class OrderMainModel(
    var INN: String?,
    var KPP: String?,
    var addressOfEstateObject: String?,
    var addressOfGardenObject: String?,
    var agentFathersName: String?,
    var agentFirstName: String?,
    var agentLastName: String?,
    var approximateSizeOfEstateObject: Double?,
    var approximateSizeOfOKS: Double?,
    var area: String?,
    var bankAccountNumber: Int?,
    var companyAddress: String?,
    var companyName: String?,
    var documents: List<Document?>
}

改造方法

@Streaming
@POST("/api/order/")
fun makeOrder(@Header("Authorization") token: String, @Body order: OrderMainModel): Single<Response<PhoneNumberResponse>>

标签: androidbase64retrofit2rx-android

解决方案


也许,您应该使用具有适当背压策略的 Flowable 而不是 Single。但是,如果您认为它适用于您的适配器,则可以使用 Jackson,因为它比 Gson 快(根据本文)。如果你想要更高的性能,也许你应该使用 Protobuf 而不是 JSON。


推荐阅读