Я предполагаю, что этот цикл не выполняется в потоке пользовательского интерфейса. Объявите две переменные экземпляра в вашем классе:
volatile long totalDownloaded;
long downloadStartTime;
Измените код вашего цикла следующим образом:
totalDownloaded = 0L;
downloadStartTime = System.currentTimeMillis();
while ((val = bis.read(buffer, 0, 1024)) > 0) {
out.write(buffer, 0, val);
totalDownloaded += val;
fileSize -= val;
if (fileSize < 1024) {
val = (int) fileSize;
}
Запланируйте задачу на выполнение в потоке пользовательского интерфейса так часто, чтобы вычислять System.currentTimeMillis() - downloadStartTime
и использовать прошедшее время и текущее значение totalDownloaded
, чтобы вычислить среднюю скорость загрузки и обновить отображение. Вы можете сделать все это отдельным методом в том же классе:
/**
* Returns average download speed in bytes/second.
*/
public float getDownloadSpeed() {
long elapsedTime = System.currentTimeMillis() - downloadStartTime;
return 1000f * totalDownloaded / elapsedTime;
}