Я пытаюсь выполнить класс AsyncTask в своем приложении для Android, который анализирует скорость сетевого подключения для загрузки и выгрузки. Сейчас я работаю над частью загрузки, но я не ожидаю результатов. Я тестирую сеть Wi-Fi, которая получает 15 Мбит/с скорость/скорость, но результаты, которые я получаю от моего приложения, составляют примерно 1 Мпб. Когда я запускаю тест скорости apk на устройстве, которое я тестирую, он получает около 3.5 Мбит/с. Функция работает, похоже, на половину скорости она должна быть. Должен ли следующий код давать точные результаты?Как правильно измерить скорость загрузки с помощью Java/Android
try {
String DownloadUrl = "http://ipv4.download.thinkbroadband.com:8080/5MB.zip";
String fileName = "testfile.bin";
File dir = new File (context.getFilesDir() + "/temp/");
if(dir.exists()==false) {
dir.mkdirs();
}
URL url = new URL(DownloadUrl); //you can write here any link
File file = new File(context.getFilesDir() + "/temp/" + fileName);
long startTime = System.currentTimeMillis();
Log.d("DownloadManager", "download begining: " + startTime);
Log.d("DownloadManager", "download url:" + url);
Log.d("DownloadManager", "downloaded file name:" + fileName);
/* Open a connection to that URL. */
URLConnection ucon = url.openConnection();
//Define InputStreams to read from the URLConnection.
InputStream is = ucon.getInputStream();
BufferedInputStream bis = new BufferedInputStream(is);
//Read bytes to the Buffer until there is nothing more to read(-1).
ByteArrayBuffer baf = new ByteArrayBuffer(1024);
int current = 0;
while ((current = bis.read()) != -1) {
baf.append((byte) current);
}
long endTime = System.currentTimeMillis(); //maybe
/* Convert the Bytes read to a String. */
FileOutputStream fos = new FileOutputStream(file);
fos.write(baf.toByteArray());
fos.flush();
fos.close();
File done = new File(context.getFilesDir() + "/temp/" + fileName);
Log.d("DownloadManager", "Location being searched: "+ context.getFilesDir() + "/temp/" + fileName);
double size = done.length();
if(done.exists()) {
done.delete();
}
Log.d("DownloadManager", "download ended: " + ((endTime - startTime)/1000) + " secs");
double rate = (((size/1024)/((endTime - startTime)/1000)) * 8);
rate = Math.round(rate * 100.0)/100.0;
String ratevalue;
if(rate > 1000)
ratevalue = String.valueOf(rate/1024).concat(" Mbps");
else
ratevalue = String.valueOf(rate).concat(" Kbps");
Log.d("DownloadManager", "download speed: "+ratevalue);
} catch (IOException e) {
Log.d("DownloadManager", "Error: " + e);
}
Пример выходных
10-08 15:09:52.658: D/DownloadManager(13714): download ended: 70 secs
10-08 15:09:52.662: D/DownloadManager(13714): download speed: 585.14 Kbps
Заранее спасибо за помощь. Если есть лучший способ, пожалуйста, дайте мне знать.
Вы читаете по одному байт за раз, это может быть довольно долго. почему бы не использовать байт [] и читать как несколько Kb одновременно? – njzk2
Обычно у вас есть ~ 600 тыс. Вызовов для 'read' и' append' каждую секунду. – njzk2
, ваше значение ставки может быть не очень точным, так как 'size',' endTime' и 'startTime' являются целыми, как 1024, 1000 и 8, и поэтому ваши вычисления производятся в целых числах до того, как они будут отправлены на длинные (это должен давать неточную фиксацию, но не несет ответственности за большую разницу, которую вы наблюдаете) – njzk2