0

アプリでファイルをダウンロードし、次のタイムアウトを使用しています。

HttpParams httpParameters = new BasicHttpParams();
HttpConnectionParams.setConnectionTimeout(httpParameters, 5000);
HttpConnectionParams.setSoTimeout(httpParameters, 5000);

時々、ファイルが部分的にしかダウンロードされません。低速のモバイル ネットワークで 5 秒以内にダウンロードが完了しない場合、5 秒の setSoTimeout でダウンロードを停止できますか?

Google Dev Docs から、次のように書かれています。

デフォルトのソケット タイムアウト (SO_TIMEOUT) をミリ秒単位で設定します。これは、データを待機するためのタイムアウトです。

これは最初のデータを待つ時間ですか、それとも次のデータを待つ時間ですか? IE ダウンロードが開始されますが、その後 5 秒間データが到着しません。

編集 SO_TIMEOUT を 100ms に減らしたテストを行いましたが、ダウンロードが 1 秒後に終了するのを止める効果はありませんでした。

4

2 に答える 2

1

低速のモバイル ネットワークで 5 秒以内にダウンロードが完了しない場合、5 秒の setSoTimeout でダウンロードを停止できますか?

いいえ、ただし、特定の read() 呼び出しでデータを受信するのに 5 秒以上かかる場合は、SocketTimeoutException をスローできます。その例外を受け取ったときに何をするかはあなた次第です。再試行できます。

読み取りタイムアウトが発生する場合は、送信者が停止したか、ネットワークがダウンしたか、読み取りタイムアウトが短すぎます。5000ms は非常に短いタイムアウトです。それを上げて、何が起こるか見てください。

于 2013-02-01T19:57:03.747 に答える
-1

ドキュメントの設定SO_TIMEOUTによるとjava.net.SocketTimeoutException、読み取り呼び出しに指定された時間よりも長い時間がかかる場合 (この場合は 5000 ミリ秒で、この待機時間はダウンロード開始からの時間を参照します)、例外が発生します。これは、例外がダウンロードプロセスを中断することを意味します。

ミリ秒単位で指定されたタイムアウトで SO_TIMEOUT を有効/無効にします。このオプションをゼロ以外のタイムアウトに設定すると、この Socket に関連付けられた InputStream での read() 呼び出しは、この時間だけブロックされます。タイムアウトになると、Socket は引き続き有効ですが、java.net.SocketTimeoutException が発生します。このオプションを有効にするには、ブロッキング操作に入る前に有効にする必要があります。タイムアウトは > 0 でなければなりません。ゼロのタイムアウトは、無限のタイムアウトと解釈されます。

于 2013-02-01T12:53:29.487 に答える