2012-03-16 2 views
5

こんにちは私は既にこの質問をしましたが、今回はすべての証明書が問題を引き起こさないようにその方法をチェックします。Android - 定期的にHttpClientのタイムアウトが発生する

iPhoneにもあるアプリを開発しています。問題はAPIリクエストにあります。すべてのリクエストのタイムアウトを設定しました。ときには、30〜60秒の間にちょっとした休憩が起こることもあります。これは、アプリケーションがカップルのリクエストを行い、ブレークよりも、約45秒後にすべての時間がタイムアウトするように見える。

これはサーバーの問題かAndroidかどうかわかりません。

この問題は、IOS 5とiPhone上で発生するだけでなく、私はHttpClientをしても、FOTのHttpsURLConnectionをチェック

IOS 4につくれていません。

接続はhttpsで、直接IPアドレスを試していました。

すべての要求に同じ問題があり、すべての要求が非同期タスクにあります。

すべての彼らは同じになります:

DefaultHttpClient client = new HttpSupport().getNewHttpClient(); 

    client.getCredentialsProvider().setCredentials(new AuthScope(AuthScope.ANY_HOST,AuthScope.ANY_PORT),new UsernamePasswordCredentials(user, pass)); 

    HttpGet httget = new HttpGet("xxxxxxxxxxxxxxxxxxxxxxx"); 
    httget.setHeader("Accept", "application/json"); 

    HttpResponse respond = null; 

    try 
    { 
     respond = client.execute(httget); 
    } 
    catch (ClientProtocolException e) 
    { 
     Log.e(TAG,"getEvents, ClientProtocolException"); 
    } 
    catch (IOException e) 
    {   
     Log.e(TAG,"getEvents, IOException: " + e.getMessage()); 
    } 

私HttpSupportクラスDORコードは、私の前の質問である:Android - API Requests

これは、サーバーの障害することができますか? ありがとうございました。

最近、私はappがclient.executeでハングしていることに気付きました。このようにしてみてください:android httpclient hangs on second request to the server (connection timed out)、しかし助けにはならないでしょう。たぶんapiの不具合ではありませんが、Androidはそのままです。このアプリは本当に頻繁にAPIを指していますが、ほとんどのリクエストで大丈夫です。

まだ30-45秒のハングアップを取り除くことはできません。

今日私は再びアプリをテストし、エラーは3.2のSamsungタブレットのwi-fi接続でのみ発生することに気付きました。 2.3.7(wi-fiと3g)のWildfireでは、すべてが問題ないようです。モバイルで問題が発生しているとは言えませんが、テスト中にタイムアウトに気づいていません。

答えて

3

クライアントのタイムアウトが短すぎます。モバイル接続では、接続の確立には最大30秒、応答を受信するには30秒を要します。 (あなたのリンクを経由して)

あなたのコードは:

int timeoutConnection = 3000; 
     HttpConnectionParams.setConnectionTimeout(params, timeoutConnection); 
     // Set the default socket timeout (SO_TIMEOUT) 
     // in milliseconds which is the timeout for waiting for data. 
     int timeoutSocket = 5000; 
     HttpConnectionParams.setSoTimeout(params, timeoutSocket); 

それはミリ秒単位です。したがって、接続タイムアウトは3秒で、応答は5秒です。

私はそれぞれ30000と60000にします。

さらに、サーバーの問題を排除する場合は、fiddler2のようなHTTPプロキシをインストールし、それを使用して各HTTP/HTTPS要求を表示すると、各サーバーの応答が表示されます。次に、クライアントまたはサーバーが誤動作しているかどうかを確認します。

+0

時間については確かですか? Wi-Fiでデバイスを使用していても、apiからのユーザーが0,5秒未満のすべての応答を送信しても、この問題が発生します。 – goodm

+0

問題は100%ではありませんが、直面する可能性があるすべての接続シナリオでは短すぎます。しかし、そういうわけで、私はフィドラーと一緒に走ることをお勧めします - それはあなたの問題を特定するのに役立ちます。 – peterept

+0

残念ながら、タイムアウトを変更しても問題は解決しませんが、待ち時間が長くなります。 – goodm

2

私はあなたの問題をはっきりと説明していませんが、私はあなたのコードを見て、開発者がコンパイル時に気をつけなければならないいくつかの隠れた欠陥実行時にそれらを放置して漏出させてください。

あなたHttpSupport.getNewHttpClient()の実装では

public DefaultHttpClient getNewHttpClient() { 
    try { 
    ... ... 

    ClientConnectionManager ccm = new ThreadSafeClientConnManager(params, registry); 

    return new DefaultHttpClient(ccm, params); 
    } catch (Exception e) { 
    return new DefaultHttpClient(); 
} 

}

あなたは、tryブロックから1は堅牢を返し両方試してみて、キャッチブロック、中にHttpClientインスタンスを返すHttpClientを認識し、正しいことプロトコル、資格情報などを使用してリモートHTTPサーバーにアクセスします。例外が発生したときにcatchブロック内の別の裸のHttpClentを返す点は何ですか?例外は通常、予想されるエラーが発生したことを意味し、コンパイル時に開発者が気を配り、実行したときに起こったことを知ることなく、アプリケーションの実行時にすべての有用な警告を無視し、時間。

最初に、例外を正しく処理するコードを変更して、単に例外スタックトレースを出力し、HttpClientを作成/初期化するときの潜在的な問題を見つけてください。

私が言いたいことは、要求に応じてHttpClientを作成/初期化することです。つまり、HTTP要求を送信する必要があるたびにHttpClientの新しいインスタンスを作成して初期化しますが、これは問題はありませんが、 IMO。

あなたの問題はおそらく、HttpClientがスレッドセーフではないため、マルチスレッド環境で(HttpClientがAsyncTaskを使用していると言っているように)HttpClientを作成/初期化することに関連していると思われます。お役に立てれば。

+0

さて、私はこれについて考えていましたが、Log.e( "HttpClient"、e.toString());私のログにはキャッチ例外が発生しません。これはこれの原因ではありません。私はこれがアプリケーションではなくサーバーの障害であると仮定しました。 – goodm

+0

それにもかかわらず、キャッチブロック内の裸のHttpClientは絶対ナンセンスです。あなたのアプリはどのようにHTTPリクエストを提起しますか? AsyncTaskを使用して複数のHTTPリクエストを同時に生成して発生させるアプリがありますか? – yorkw

関連する問題