Android Studio Kotlin FTP上传在AVD正常但华为真机大文件上传异常
异常根因
- 并发FTP连接超出限制
你当前代码每次上传一张图就启动一个独立线程单独建立FTP连接,6个大文件同时上传时,真机移动网络稳定性远低于模拟器,很容易触发FTP服务器的单IP并发连接限制、端口占用冲突或连接超时,小文件上传速度快不会触发该问题,大文件上传周期长就会出现连接被拒、传输中断的情况,表现为部分文件不上传或者上传不完整。 - 子线程违规操作UI
你在FTPthread的run方法中直接修改TextView内容,Android规定UI控件仅能在主线程操作,该操作会抛出未捕获异常,直接中断上传流程,也是上传逻辑经常执行不完整的核心原因之一。 - 内存与资源配置错误
你设置了32MB的单次读取缓冲区(ByteArray(33554432)),堆内存占用过高,华为真机的内存管理策略比模拟器严格,很容易触发GC甚至OOM;同时你重复打开了两次FileInputStream,第一次打开的流未关闭,存在资源泄漏,大文件传输时会导致流读取异常,上传的文件不完整,表现为画质极差。 - 缺少异常容错机制
代码没有上传失败重试逻辑,移动网络出现短暂波动时,大文件传输就会直接失败,也没有错误日志埋点,无法定位具体错误环节。 - 系统策略限制
华为手机的电池优化默认会限制后台应用的长时间网络活动,上传大文件时很容易被系统切断网络,导致传输中断。
排查解决步骤
- 改为串行上传逻辑,复用同一个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
相关产品推荐
相关产品推荐

