Kotlin Android使用XML-RPC向Odoo发送BASE64图片传输过慢问题咨询
问题根因及优化方案
- 开启XML-RPC请求压缩
Apache XML-RPC默认不开启请求压缩,而Odoo网页端上传默认启用gzip压缩,6MB的base64内容压缩后体积可减少70%以上,大幅降低传输耗时。你可以在初始化XmlRpcClient配置时开启压缩:
val config = XmlRpcClientConfigImpl() // 开启请求gzip压缩 config.isGzipCompressing = true // 要求服务端返回压缩响应 config.isGzipRequesting = true
- 替换Base64编码实现
Apache XML-RPC内置的Base64序列化实现效率极低,处理大文件时会占用大量CPU时间导致耗时增加。你可以提前用安卓原生android.util.Base64将图片编码为字符串后再传入请求参数,跳过库自带的序列化逻辑,编码速度可提升3~10倍。 - 复用HTTP连接
不要每次上传都新建XmlRpcClient实例,全局复用同一个实例即可复用底层TCP连接,减少HTTPS握手、TCP慢启动的额外耗时,单请求可减少1~3秒的连接开销。 - 精简请求参数
调用Odoo接口创建附件时,仅传入必填参数即可:datas(base64内容)、name(文件名)、res_model(关联模型)、res_id(关联记录ID)、datas_fname(文件显示名),多余的非必填参数会增加Odoo服务端处理时间。 - 替换XML-RPC实现(可选)
Apache XML-RPC最后稳定版发布于2017年,未针对移动端做性能优化,你可以直接用OkHttp自行构造XML-RPC请求体,配合Okio做序列化,整体传输耗时可再降低50%以上。
你提到的多线程上传耗时无差异的现象,说明当前瓶颈并非带宽,而是单请求的序列化、连接建立耗时,完成前几项优化后即可解决700KB文件传输耗时8秒的问题。
内容的提问来源于stack exchange,提问作者Heromanofe
相关产品推荐
相关产品推荐

