You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Studio Kotlin FTP上传在AVD正常但华为真机大文件上传异常

异常根因
  1. 并发FTP连接超出限制
    你当前代码每次上传一张图就启动一个独立线程单独建立FTP连接,6个大文件同时上传时,真机移动网络稳定性远低于模拟器,很容易触发FTP服务器的单IP并发连接限制、端口占用冲突或连接超时,小文件上传速度快不会触发该问题,大文件上传周期长就会出现连接被拒、传输中断的情况,表现为部分文件不上传或者上传不完整。
  2. 子线程违规操作UI
    你在FTPthread的run方法中直接修改TextView内容,Android规定UI控件仅能在主线程操作,该操作会抛出未捕获异常,直接中断上传流程,也是上传逻辑经常执行不完整的核心原因之一。
  3. 内存与资源配置错误
    你设置了32MB的单次读取缓冲区(ByteArray(33554432)),堆内存占用过高,华为真机的内存管理策略比模拟器严格,很容易触发GC甚至OOM;同时你重复打开了两次FileInputStream,第一次打开的流未关闭,存在资源泄漏,大文件传输时会导致流读取异常,上传的文件不完整,表现为画质极差。
  4. 缺少异常容错机制
    代码没有上传失败重试逻辑,移动网络出现短暂波动时,大文件传输就会直接失败,也没有错误日志埋点,无法定位具体错误环节。
  5. 系统策略限制
    华为手机的电池优化默认会限制后台应用的长时间网络活动,上传大文件时很容易被系统切断网络,导致传输中断。
排查解决步骤
  • 改为串行上传逻辑,复用同一个FTP连接依次上传6张图片,不要同时启动6个并发FTP线程,大幅降低网络开销和服务器限制触发概率;如果必须使用并发,最多同时开启2个线程,提前确认FTP服务器的单IP并发连接上限。
  • 修复UI操作逻辑,所有修改TextView的代码都用runOnUiThread包裹,切换到主线程执行,避免子线程操作UI抛出异常中断上传。
  • 调整缓冲区大小为8KB~16KB即可,示例:val bytesIn = ByteArray(8 * 1024),小缓冲区循环读写的稳定性更高,内存占用也更低;删除重复打开FileInputStream的冗余代码,用Kotlin的use函数自动管理流的关闭,避免资源泄漏。
  • 添加上传失败重试机制,单文件上传失败后自动重试2~3次,重试前间隔500ms适配移动网络波动;添加各步骤日志打印,输出FTP连接、登录、设置传输模式、上传每个阶段的响应码,快速定位故障环节。
  • 把应用添加到华为手机的电池优化白名单,避免系统后台限制网络活动导致传输中断。

内容的提问来源于stack exchange,提问作者Mathilde Lebrun

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 15:39:03