Как измерить скорость загрузки с помощью OkHTTP? - PullRequest
0 голосов
/ 13 февраля 2019

Я загружаю файл, используя OkHttp3, я хочу увидеть скорость загрузки.но я не совсем понимаю, как измерить скорость.

Я пытался получить текущий миллис перед чтением буфера и вычислить после его записи, но он всегда возвращает статическое значение.

моя функция загрузки.

fun download(fileName: String) {
    val request = Request.Builder().url(url)
        .get().build()
    val call = OkHttpClient().newCall(request)
    val response = call.execute()

    if (response.isSuccessful) {
        var inputStream: InputStream? = null

        try {
            inputStream = response.body()?.byteStream()
            val buffer = ByteArray(8192)
            val mediaFile = File(downloadDir, fileName)
            val output = RandomAccessFile(mediaFile, "rw")
            output.seek(0)

            while (true) {
                val readed = inputStream?.read(buffer)

                if (readed == -1 || readed == null) {
                    break
                }

                output.write(buffer, 0, readed)
                downloaded.append(readed.toLong())
            }
            output.close()
        } catch (e: IOException) {
            // TODO: handle IOException
            console.log("${e.message}")
        } finally {
            inputStream?.close()
        }
    }
}

1 Ответ

0 голосов
/ 13 февраля 2019

Это очень простая проблема, я запутался, подумав.В любом случае, вот решение.

все, что мне нужно сделать, это сохранить загруженные байты в переменной после 1s вычесть загруженные байты из вновь загруженных байтов, что даст мне загруженные байты в 1s, затемЯ могу использовать эти байты для преобразования в скорость как kbps или Mbps.

fun getSpeed(callback: (String) -> Unit) {
    doAsync {
        var prevDownloaded = 0L
        while (true) {
            if (contentLength != null) {
                if (downloaded.get() >= contentLength!!) {
                    break
                }
            }

            if (prevDownloaded != 0L) {
                callback(formatBytes(downloaded.get() - prevDownloaded))
            }
            prevDownloaded = downloaded.get()
            Thread.sleep(1000)
        }
    }
}
...