2013-06-11 18 views
10

サーバーから大きなサイズのzipファイルをダウンロードしています。私は次のようになっています大きなサイズのzipファイルをダウンロード中にSocketExceptionが発生しました

06-11 21:45:18.789: I/System.out(8993): java.net.SocketException: recvfrom failed: ETIMEDOUT (Connection timed out) 

私のアプリケーションは停止しますが、ダウンロードが停止します。これは、hdpiアンドロイド携帯電話で特に低プロセッサデバイスと言われています。ダウンロードはS3とタブレットで正常に動作します。私は単純なFileOutputStreamメソッドを使用してファイルをダウンロードしています。

+0

ここで私は を使用しています –

答えて

3

あなたが

HttpURLConnectionのCON =(HttpURLConnectionが)url.openConnectionをタイムアウトを増やすのHttpConnectionを使用している場合は();

con.setReadTimeout(10000);

OR

HttpConnectionParams.setSoTimeout(httpParameters、10000); //

+0

のNOP @hharryをあなたのコードを貼り付けてください。** BufferedInputStreamを入力=新しいBufferedInputStreamを(url.openStream()、8192) ; ** –

+0

このSO [リンク](http://stackoverflow.com/questions/2638283/can-i-set-a-timeout-for-a-inputstreams-read-function)によると、あなたは、ソケットにタイムアウトを設定することができます。 'ソケット#setSoTimeout(int)'。 –

1

私はこれが問題かもしれないと確信していませんが、それは可能です。これは低プロセッサーデバイスで起こると言います。リモートサーバーのアップストリームビットレートはクライアントのダウンストリームビットレートでは処理できないほど大きく、大容量のファイルでは発生する可能性があります。ビットレートを処理しないと、Socketが崩壊し、タイムアウトになります。

私の提案は、帯域制限レートリミッタを実装しようとしています。このようにして、遅いデバイスは遅くなるが、それらの長いダウンロードにうまく対応するかどうかをテストすることができます。

3

私は推測する、あなたのダウンロードを終了するためにWakeLockを取得し、それを解放する必要があります。特に、Wi-Fi接続を介して大きなファイルをダウンロードする場合は、無線を目覚めさせるためにWifiLockを取得するのが一般的です。

一方、あなたがまだいない場合は、DownloadManagerを試してみてください。 this official article on wakelocksとしての状態、

"あなたのアプリが長時間実行されるHTTPダウンロードを実行している場合、DownloadManagerを使用することを検討してください。" リンクの下に

0

HTTPサーバーを使用するには、Loopjライブラリをお勧めします。信頼性が高く、シンプルで使いやすいライブラリです。 ドキュメントでは、単にこのようなファイルをダウンロードすることができます言ったように:

AsyncHttpClient client = new AsyncHttpClient(); 
String[] allowedContentTypes = new String[] { "image/png", "image/jpeg" }; 
client.get("http://example.com/file.png", new BinaryHttpResponseHandler(allowedContentTypes) { 
    @Override 
    public void onSuccess(byte[] fileData) { 
     // Do something with the file 
    } 
}); 
関連する問題