Модификация с RX запускает OutOfMemory при попытке отправить большой BASE64 - PullRequest
0 голосов
/ 21 сентября 2019

Я хочу отправить модель Retrofit, которая содержит несколько стандартных полей и файлов, закодированных в формате BASE64.Я знаю, что это неправильный способ отправки файлов, но у меня есть сервер без внутреннего разработчика.

Итак, когда я отправляю, например, 3 файла в формате PDF по 20 МБ каждый, я запускаю память, исключение, подобное этому

Failed to allocate a 30544558 byte allocation with 2085152 free bytes and 26MB until OOM

Я понял, что это проблема вРазбор строки base64, который у меня уже есть в памяти, чтобы Json бросил 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>>

1 Ответ

0 голосов
/ 21 сентября 2019

Возможно, вам следует использовать Flowable с правильной стратегией противодавления вместо Single.Но если вы думаете, что это для вашего адаптера, вы можете использовать Джексона, потому что он быстрее, чем Gson (согласно этой статье).И если вы хотите большей производительности, возможно, вам следует использовать Protobuf вместо JSON.

...