liangjingkanji / Net

Android 基于协程/OkHttp网络请求工具
http://liangjingkanji.github.io/Net/
MIT License
1.8k stars 209 forks source link

上传进度回调Progress,finish字段失效 #187

Closed 530l closed 11 months ago

530l commented 11 months ago

问题描述

Post<ArrayData>("xxxxxxxxx") {
  param("fileData", getAssetsFile())
      addUploadListener(object : ProgressListener() {
        override fun onProgress(p: Progress) {
            activity?.runOnUiThread {
                Log.i(
                    "Progress",
                    "上传进度: ${p.progress()}% 上传速度: ${p.speedSize()}     " +
                            "\n\n文件大小: ${p.totalSize()}  已上传: ${p.currentSize()}  剩余大小: ${p.remainSize()}" +
                            "\n\n已使用时间: ${p.useTime()}  剩余时间: ${p.remainTime()}  ${p.finish}"
                )
            }
  }
}

东哥,问下,上传文件,p.finish这个字段是 false, 影响这个字段逻辑有那些,上传到服务端,服务端上传 oss

2023-07-17 18:24:13.225 15843-15843/com.drake.net.sample I/Progress: 上传进度: 0% 上传速度: 0 B     

    文件大小: 2.70 MB  已上传: 8.19 kB  剩余大小: 2.69 MB

    已使用时间: 00:00  剩余时间: 00:00  false

2023-07-17 18:24:13.445 15843-15843/com.drake.net.sample I/Progress: 上传进度: 100% 上传速度: 12.12 MB     

    文件大小: 2.70 MB  已上传: 2.70 MB  剩余大小: 0 B

    已使用时间: 00:00  剩余时间: 00:00  false

期望行为

如何复现

fork仓库并复现问题可以快速解决, 猜测只会让问题晦涩难懂, 耽误所有人时间

截图

异常堆栈信息或者手机截图/视频(拖拽到输入框即可上传)

版本

liangjingkanji commented 11 months ago

我也不清楚我需要去阅读源码才能知道, 因为时隔时间太长, 目前我在修复其他项目的bug暂时没空处理此问题(你没有fork仓库复现问题我认为此问题应该不紧急)

这么好的源码你不试着也去阅读下吗? 我认为这是少有的注重可读性而非设计模式的OkHttp最佳实践

liangjingkanji commented 11 months ago

复现不出来你说的这个问题, 建议你要么fork仓库要么自己debug排查下finish字段是否未执行到

530l commented 11 months ago

查看源码,NetResponseBody中的read()方法中 progressListeners size =0 ,而这个progressListeners在NetOkHttpInterceptor中,只设置了RequestBody的 val reqBody = request.body?.toNetRequestBody(request.uploadListeners()) ,并没有set ResponseBody的监听,不知道是不是这个导致是 progressListeners zise =0.,没有进入条件判断。

liangjingkanji commented 11 months ago

你确定没有吗? 你查下toNetResponseBody的调用方式吧, 而且如果没有监听器等于0那么压根没有进度, 何来的finish=false

你这排查的有点离谱

530l commented 11 months ago

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 } }

"""

image image

上传进度有值,值是从NetRequestBody 的write方法 progressListener.onProgress更新的。

liangjingkanji commented 11 months ago

上传在toNetRequestBody()中传入

image

你看下finish = true这条件走到没有吧

530l commented 11 months ago

那就是 finish 这个字段只是下载情景才有使用的。上传没用的

liangjingkanji commented 11 months ago

那你发现问题所在了, 上传逻辑漏了, 此问题会尽快修复