Tôi đang làm việc trên một ứng dụng Android mà tôi cần, chính xác nhất có thể, đo tốc độ tải xuống của kết nối hiện tại. Dưới đây là phương pháp tốt nhất mà tôi có thể tìm thấy (về cơ bản tôi bắt đầu hẹn giờ, bắt đầu tải xuống bản phân phối Linux từ máy chủ nhanh, tải xuống khoảng 200 kbyte, sau đó dừng bộ đếm thời gian và kiểm tra thời gian trôi qua và tổng số byte đã tải xuống):Đo tốc độ tải xuống bằng Java/Android
try{
InputStream is = new URL("http://www.domain.com/ubuntu-linux.iso").openStream();
byte[] buf = new byte[1024];
int n = 0;
startBytes = TrafficStats.getTotalRxBytes(); /*gets total bytes received so far*/
startTime = System.nanoTime();
while(n<200){
is.read(buf);
n++;
}
endTime = System.nanoTime();
endBytes = TrafficStats.getTotalRxBytes(); /*gets total bytes received so far*/
totalTime = endTime - startTime;
totalBytes = endBytes - startBytes;
}
catch(Exception e){
e.printStackTrace();
}
Sau đó, tôi chỉ cần chia số byte được truyền theo thời gian đã thực hiện và nó sẽ cho tốc độ tải xuống bằng bps.
Câu hỏi: 1. Phương pháp này có chính xác không? 2. Bạn có biết tốt hơn không?
Cảm ơn rất nhiều.
Chúng theo cách bạn đã thiết lập ngay bây giờ, nó sẽ không chính xác. 'InputStream.read' không được đảm bảo để điền đầy đủ bộ đệm của bạn. Bạn cần kiểm tra giá trị trả về để xem có bao nhiêu 'byte' đã thực sự được đọc. – Jeffrey
@Jeffrey, bạn không đọc mã chi tiết. Tôi không dựa vào read() để lấy số byte. Tôi nhận được nó trực tiếp từ hệ điều hành thông qua hàm getTotalRxBytes(). –
Ahh, tệ lắm. Tôi đã thực sự lướt qua phần đó. Giải pháp bạn có sẽ ít nhiều chính xác. – Jeffrey