Closed 530l closed 11 months ago
我也不清楚我需要去阅读源码才能知道, 因为时隔时间太长, 目前我在修复其他项目的bug暂时没空处理此问题(你没有fork仓库复现问题我认为此问题应该不紧急)
这么好的源码你不试着也去阅读下吗? 我认为这是少有的注重可读性而非设计模式的OkHttp最佳实践
复现不出来你说的这个问题, 建议你要么fork仓库要么自己debug排查下finish字段是否未执行到
查看源码,NetResponseBody中的read()方法中 progressListeners size =0 ,而这个progressListeners在NetOkHttpInterceptor中,只设置了RequestBody的 val reqBody = request.body?.toNetRequestBody(request.uploadListeners()) ,并没有set ResponseBody的监听,不知道是不是这个导致是 progressListeners zise =0.,没有进入条件判断。
你确定没有吗? 你查下toNetResponseBody
的调用方式吧, 而且如果没有监听器等于0那么压根没有进度, 何来的finish=false
你这排查的有点离谱
progress.finish = true 只有 2 处赋值为 true ,一处是 下载校验 md5 设置为 true 。 还有一处是NetResponseBody的 read方法 """ progressListeners.forEach { progressListener -> progressListener.intervalByteCount += if (bytesRead != -1L) bytesRead else 0 val currentInterval = currentElapsedTime - progressListener.elapsedTime if (!progress.finish && (readByteCount == contentLength || bytesRead == -1L || currentInterval >= progressListener.interval)) { if (readByteCount == contentLength || bytesRead == -1L) { progress.finish = true } progressListener.onProgress( progress.apply { currentByteCount = readByteCount totalByteCount = contentLength intervalByteCount = progressListener.intervalByteCount intervalTime = currentInterval } ) progressListener.elapsedTime = currentElapsedTime progressListener.intervalByteCount = 0L } }
"""
上传进度有值,值是从NetRequestBody 的write方法 progressListener.onProgress更新的。
上传在toNetRequestBody()
中传入
你看下finish = true
这条件走到没有吧
那就是 finish 这个字段只是下载情景才有使用的。上传没用的
那你发现问题所在了, 上传逻辑漏了, 此问题会尽快修复
问题描述
东哥,问下,上传文件,p.finish这个字段是 false, 影响这个字段逻辑有那些,上传到服务端,服务端上传 oss
期望行为
如何复现
截图
异常堆栈信息或者手机截图/视频(拖拽到输入框即可上传)
版本