Comment bien mesurer la vitesse de téléchargement avec Java / Android

Je suis en train d'effectuer une AsyncTask classe dans mon application Android qui permet d'analyser le réseau de la vitesse de connexion pour le téléchargement et le téléchargement. Je suis en train de travailler sur le téléchargement de la partie, mais je ne suis pas l'obtention de résultats que j'attends. Je suis en essais sur un réseau Wifi qui obtient 15Mbps bas/haut vitesse constante, cependant, les résultats que j'obtiens de mon application sont plus autour de peine 1Mpbs. Quand je lance le test de vitesse apk sur l'appareil que je suis en essais sur qui obtient près de 3,5 Mbps. La fonction fonctionne, semble juste être la moitié de la vitesse il devrait être. Si le code suivant à produire des résultats?

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

Exemple de sortie

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

Merci d'avance pour l'aide. Si il y a une meilleure méthode, s'il vous plaît laissez-moi savoir.

vous êtes à la lecture d'un octet à la fois, cela peut être assez long. pourquoi ne pas utiliser un byte[] et de lire comme plusieurs Ko à la fois ?
En général, vous avez ~600K appels à read et append à chaque seconde.
aussi, votre taux de valeur peut ne pas être très précis, car size, endTime et startTime sont des entiers, comme le sont les 1024, 1000 et 8, et donc votre calcul est fait en entier avant d'être coulé à long (ce qui devrait donner imprécis mesure, mais n'est pas responsable de la grande différence observez-vous)
De mon temps les valeurs sont de longs et mesurée de l'ordre de la milliseconde. @njzk2, je vais regarder dans la lecture de plusieurs octets à la fois. J'ai testé quelques fois sur d'autres réseaux et je suis semblent obtenir des résultats plus proches c'est peut-être un problème avec mon wifi à la maison.
en moyenne entier dans le sens que la conversion en double est faite après le calcul est fait, et par conséquent, il est de précision perdu. Cependant, je suis assez confiant, la méthode de lecture est la cause du problème de vitesse.

OriginalL'auteur Joffroi | 2013-10-08