尝试通过发送大型BASE64来进行RX改造会耗尽内存(OutOfMemory)

时间:2019-09-20 21:46:31

标签: android base64 retrofit2 rx-android

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

例如,当我发送3个pdf文件(每个20mb)时,我的内存用完了,像这样的异常

  

无法分配30544558字节的分配空间,其中2085152个空闲字节和26MB的空间直到OOM为止

我发现,解析base64字符串是一个问题,我已经在内存中供Json抛出GSON。根据{{​​3}},我曾尝试创建一个自定义适配器,但是在使用大型模型的情况下,这种想法会用光。将大字符串传递给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>>

1 个答案:

答案 0 :(得分:0)

也许,您应该将Flowable与适当的背压策略一起使用,而不要使用Single。 但是,如果您认为它适合您的适配器,则可以使用Jackson,因为它比Gson更快(根据this文章)。 而且,如果您想提高性能,则应该使用Protobuf而不是JSON。