android - 在尝试发送大型 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>>
解决方案
也许,您应该使用具有适当背压策略的 Flowable 而不是 Single。但是,如果您认为它适用于您的适配器,则可以使用 Jackson,因为它比 Gson 快(根据本文)。如果你想要更高的性能,也许你应该使用 Protobuf 而不是 JSON。