2011-08-22 21 views
6

私は、AndroidデバイスからWebサーバーにファイルをアップロードするためにHttpClientを使用する必要があるAndroidアプリケーションで作業しています。私がアップロードしているファイルは1Gbまでのサイズに達することができるので、アップロード中にデバイスの接続が失われるとタイムアウトが発生する可能性があります。奇妙なことは、私がソケットに設定したタイムアウトは何の効果もないようです。 SocketTimeoutExceptionを発生させるのではなく、接続が失われるたびにアプリケーションが停止します。Apache HttpClient 4.0がAndroid上でソケットのタイムアウトに失敗しました

私が使用してみました:

HttpConnectionParams.setConnectionTimeout(params, CrashLogParams.TIMEOUT); 
HttpConnectionParams.setSoTimeout(params, CrashLogParams.TIMEOUT); 

をが、これは唯一の接続タイムアウトではなく、ソケットタイムアウトのために働いていました。また、私が試した:

HttpParams p = httpclient.getParams(); 
p.setIntParameter(CoreConnectionPNames.SO_TIMEOUT, 10000); 
p.setIntParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, 10000); 

私はアプリケーション

httpclient.execute(httppost); 

を実行した後、接続タイムアウトの例外になるだろう、ので、私は、接続タイムアウトが動作することを知っている理由は、アップロード中に接続が失われたときにハングアップするようですただし、アプリケーションがサーバーに正常に接続した後。

私のアプリをテストするために、アプリケーションをどのように反応させるかを確認するために、ネットワークを別の時間に無効にしました。要求を送信する前にネットワークを無効にすると、接続エラーが発生し、アプリケーションで正常に処理できますが、アップロード中に無効にするとアプリケーションがハングアップします。もちろん、AsyncTasksを通じてこれらのリクエストをすべて実行しているので、メインのUIスレッドはクラッシュしません。私は、ソケットがデータを受け取っていないときにタイムアウトするかどうかを確認する他の方法があるかどうか、あるいは私がここで何かを見つけていないのかどうか疑問に思っています。私は多くのブログや投稿を読んだことがありますが、それらのほとんどはSO_TIMEOUTを使って私にはうまくいかないことを示唆しています。

sotimeout not working in a multipart http post on android 2.1

+0

あなたのアプリは、より小さなサイズのファイルで動作しましたか? – momo

+0

1 MBのファイルを試しましたが、バグはまだ残っています。私は小さいファイルでは、ファイルのアップロードの間に何度も切断する可能性が高いと思いますが、その点以外にもあります。ネットワーク障害が発生した場合でもアプリケーションを堅牢にしたいと考えています。 –

+0

アップロードサイズがかなり小さく、数kbのオーダーであることを除いて、私はこれとまったく同じ問題を抱えています。バグを引き起こすために必要と思われるのは、起動しているかどうかをチェックした後、execute()を呼び出す前にネットワークがダウンすることです。 – Michael

答えて

0

は、あなたがあなた自身のClientConnectionManagerを作成していますか? AndroidHttpClient.newInstance()sourceをご覧ください。

これらは、新しいBasicHttpParamsオブジェクトを作成し、ThreadSafeClientConnectionManagerとDefaultHttpClientの両方のコンストラクタに渡します。コンストラクタ以外のClientConnectionManagerでパラメータを設定する方法はありません。

+1

はいSSLを有効にする独自のHttpClientを作成するためにDefaultHttpClientを拡張しています。拡張クラスはcreateClientConnectionManager()をオーバーライドし、あなたが述べたようにHttpParamsを設定します。私がリストアップしたコードは、タイムアウト時間を増やしたときに例外が発生するまで待たなければならなかった時間もそれに応じて増えたので、接続タイムアウトを正しく設定できました。唯一の問題は、私が試した値に関係なく、ソケットのタイムアウトが決して上がらないことです。 –

0

私はあなたと同じ問題に直面しており、同じ使用例があります。これは、Androidの2.3.6を実行しているsamsung galaxy s2で起こりますが、4.xでは同じデバイスでは起こりません。残念ながらこれはまさに私の顧客が使用するデバイスであり、さまざまなAndroidバージョンとコンストラクタを備えた約10個のテストデバイスでうまく動作します...

ApacheのHttpClientではなくHttpUrlConnectionライブラリで試してみましたが、同じです。 AndroidHttpClientは同じ動作を示します。これは、ハードウェアの実装やOSに関連する問題のように聞こえる。

私が見つけた唯一の回避策は、別のスレッドにHttpClient.execute()メソッドを置き、thread.join(timeout)を呼び出してスレッドを停止させる間違っている。欠点は、アップロードが正常に実行されているが、タイムアウトよりも時間がかかる場合です。リクエストが中断されます...

それまでに何かを見つけた場合は、共有していただければ幸いです。

関連する問題