我正在嘗試在我的Android應用程序中執行一個AsyncTask類,以分析下載和上傳的網絡連接速度。我現在正在下載部分,但我沒有得到我期望的結果。我正在一個Wifi網絡上進行測試,這個網絡的速度一直保持在15Mbps以下,但是從我的應用程序中得到的結果更差不多在1pbs左右。當我在設備上運行速度測試apk時,我測試的速度大約爲3.5Mbps。該功能起作用,似乎只有它的一半速度。下面的代碼應該產生準確的結果嗎?如何使用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
通常情況下,你有〜600K每秒調用'read'和'append'。 – njzk2
此外,您的費率值可能不是非常精確,因爲'size','endTime'和'startTime'是整數,1024,1000和8也是如此,因此您的計算在被轉換爲long應該給出不精確的測量結果,但不對您觀察到的巨大差異負責) – njzk2