9

現在の接続のダウンロード速度を可能な限り正確に測定する必要があるAndroidアプリに取り組んでいます。これまでに見つけた最良の方法は次のとおりです(基本的に、タイマーを開始し、高速サーバーからLinuxディストリビューションのダウンロードを開始し、約200キロバイトをダウンロードしてから、タイマーを停止し、経過時間とダウンロードされた合計バイト数を確認します):

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

その後、転送されたバイト数を所要時間で割るだけで、ダウンロード速度がbpsで表示されます。

質問:1。この方法は正確ですか?2.もっと良いものを知っていますか?

どうもありがとう。

4

3 に答える 3

6

ここにはいくつかの問題があります。

  1. 任意のデバイスでオンザフライでこれを実行する場合(ラボ設定ではなく)、他のアプリはによって報告される帯域幅を消費する可能性があるため、ジェフリーの推奨事項に従う必要がありますgetTotalRxBytes()

  2. これは、このホストからのダウンロード速度をテストします。それがあなたが「本物」のために通信するホストであるなら、それはクールです。または、一般的にダウンロード速度のアイデアが必要な場合は、問題ありません。ただし、サイトAとサイトBが同じ大陸にない可能性があるため、サイトAからのダウンロード速度をテストし、サイトBで正確であると想定することは信頼できません。

  3. これを頻繁に行うことを期待している場合、テスト対象のホストの所有者は、帯域幅の費用や過剰なログエントリなどで、軽度のイライラを感じる可能性があります。理想的には、自分が所有するものに対してのみこれを行います。

  4. 従量制データプランの場合、200KBはデバイス所有者を苛立たせる可能性があります。

  5. インターネットアクセス(サーバーがダウンしている可能性があるなど)およびモバイルデバイス(ユーザーがWiFiを開始して範囲外に移動し、ダウンロード機能が大幅に変更される可能性があるなど)に関するすべての標準的な警告が適用されます。

そうは言っても、ダウンロードを実行することが、ダウンロード速度を測定する唯一の実際の方法です。

于 2012-09-04T11:40:39.770 に答える
2

以下のコードを使用してください。ダウンロード速度の測定に使用しました。ダウンロード速度を測定するためにファイルを保存する必要はありません。また、おそらくOkHttpを使用する必要はありません。私たちのプロジェクトで使用されたので使用しました。

    String downloadURL = "http://test.talia.net/dl/1mb.pak";

    MediaType FILE = MediaType.parse("multipart/form-data;");

    OkHttpClient downloadClient = new OkHttpClient().newBuilder()
            .build();

    Request download = new Request.Builder()
            .url(downloadURL)
            .build();

    downloadClient.newCall(download).enqueue(new Callback() {
        @Override
        public void onFailure(Call call, IOException e) {

        }

        @Override
        public void onResponse(Call call, Response response) throws IOException {
            if(response!=null) {
                long startTime = System.currentTimeMillis();
                InputStream is = response.body().byteStream();
                BufferedInputStream bis = new BufferedInputStream(is);
                long size = 0;
                int red = 0;
                byte[] buf = new byte[1024];
                while ((red = bis.read(buf)) != -1) {
                    size += red;
                }
                long endTime = System.currentTimeMillis();
                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");
                if(is!=null) {
                    is.close();
                }
                if(bis!=null) {
                    bis.close();
                }
                Log.d("download", "download speed = " + ratevalue);
            }
        }
    });
于 2017-03-23T12:51:19.380 に答える
0

多くのサンプリング方法があり、「真の」速度はありません。次の基準を確認して、推奨される方法を詳しく知ることができます。

https://itu.int/en/ITU-T/CI/Pages/IM/Internet-speed.aspx

https://itu.int/itu-t/recommendations/rec.aspx?rec=q.3960

https://itu.int/ITU-T/recommendations/rec.aspx?rec=14125

https://tools.ietf.org/pdf/rfc6349.pdf

提案されたコードは、1つのスレッドを使用して速度をテストします。これは、インターネット接続の全容量を最大化しないため、推奨される方法ではありません。ほとんどの標準では、マルチスレッドテストが推奨されています。

また、必要なことを実行し、ITU標準に準拠しているAndroidSDKを使用することもできます。

https://github.com/speedchecker/speedchecker-sdk-android

于 2020-11-13T12:19:09.467 に答える