2010-12-16 5 views
0

私はネットワークhttp要求を作成し、応答を待つ方法を開発しました。私は今、http応答が予想より長くかかる場合、何らかの例外とエラーを投げてそのconnectinnをキャンセル/終了したいシナリオを扱いたいと思っています。java:ネットワークコールに時間がかかる場合、例外またはエラーをスローしますか?

私は例外とエラーをスローする方法を尋ねていませんが、私はそれを知っています。以下

擬似は次のようなものです:

    は、いくつかのタイマー
  1. を開始
  2. 応答がXの後に取り出されますdoesntの場合は、エラー/例外をスロー、httpリクエスト
  3. に対するHTTPリクエスト
  4. 待機させます。

私はhttp要求をするときにjvmが最後に例外をスローする前に、アプリケーションをフリーズして3-4分待たずにこの例外を速くスローしたい場合がありました。事前に

おかげ

イムアンドロイド特定のlibsやJava 5つのlibsのいずれかがこれを実現する方法については、たとえばsufficiantしなければならないので、Androidのアプリケーションのためにこれをやって。

編集:ここに私のhttpリクエストコードは、Apache LIBSを使用してどのように見えるかです:

import org.apache.http.Header; 
import org.apache.http.HttpEntity; 
import org.apache.http.HttpResponse; 
import org.apache.http.client.ClientProtocolException; 
import org.apache.http.client.HttpClient; 
import org.apache.http.client.methods.HttpGet; 
import org.apache.http.client.methods.HttpPost; 
import org.apache.http.entity.ByteArrayEntity; 
import org.apache.http.entity.InputStreamEntity; 
import org.apache.http.entity.StringEntity; 
import org.apache.http.impl.client.DefaultHttpClient; 
import org.apache.http.protocol.BasicHttpContext; 
import org.apache.http.protocol.HttpContext; 
import org.apache.http.util.EntityUtils; 


private HttpClient httpclient; 
private HttpGet get; 
private HttpPost post; 

/** 
    * POST request 
    */ 
    private HttpResponseObject PostRequest() { 

     //int response = 0; 

     String responseBody = ""; 
     HttpResponseObject response = new HttpResponseObject(); 

     try { 

      Log.d(TAG, "IN POST_REQUEST_METHOD"); 
      Log.d(TAG, "URL : " + url); 

      httpclient = new DefaultHttpClient(); 



      post = new HttpPost(url); 


      ByteArrayEntity entity = new ByteArrayEntity(data.getBytes()); 
      entity.setChunked(true); 

      post.setEntity(new StringEntity(data)); 

      HttpResponse httpResponse = httpclient.execute(post); 

      HttpEntity resEntity = httpResponse.getEntity(); 


      if (resEntity != null) { 
       // indicate that the content of this entity is no longer 
       // required 
       response.setResponseBody(EntityUtils.toString(resEntity)); 

       Header[] header = httpResponse.getAllHeaders(); 

       Log.d(TAG, "httpResponse.getAllHeaders() = " + header[0].getName()); 
       response.setResponseHeader(httpResponse.getAllHeaders().toString()); 
       resEntity.consumeContent(); 
      } 

      // release all recources from the httpClient object 
      httpclient.getConnectionManager().shutdown(); 

      response.setResponseCode(httpResponse.getStatusLine().getStatusCode()) ; 

      Log.d(TAG, "responseBody = " + response.getResponseBody()); 
      Log.d(TAG, "response code = " + response.getResponseCode()); 
      Log.d(TAG, "response header = " + response.getResponseHeader()); 

      return response; 

     } catch (Exception e) { 
      e.printStackTrace(); 
      Log.d(TAG, "exception e = " + e.toString()); 
      return null; 
     } 

    } 
+0

参照:https://stackoverflow.com/questions/240320/how-can-i-wrap-a-method-so-that-i-can-kill-its-execution-if-it-exceeds-a -specifi –

答えて

1

あなたがHttpClient 4.0.xを使用していると仮定すると、この種のものを制御する方法はconnection parametersを設定します。

+0

ありがとう。私はそれを働かせることができます。歓迎 – jonney

+0

あなたは歓迎です:-) –

0

あなたはFuture変数を使用してFuture.get(long timeout, TimeUnit unit)を使用することができます。

例外のいくつかの種類に加えて、私はそれはあなたがここで何を言ってるのかかどう Errorをスローしないようにあなたをアドバイスしたいエラー

を投げ

...。 Errorのドキュメントから

エラーは、合理的なアプリケーションがをキャッチすべきではない重大な問題を示すThrowableのサブクラスです。

+0

エラーが表示されるのは、ユーザーにエラーメッセージを表示することです。私のhttp要求コードの編集を見て、どのように見えるのですか – jonney

2

java.net.HttpUrlConnectionをお使いですか? HttpUrlConnectionjava.net.UrlConnectionのサブクラスであり、方法はsetConnectTimeout(int)setReadTimeout(int)です。 connect()またはInputStream.read()でこれらのしきい値を超えると、IOExceptionがスローされます。

Javadocで...

setConnectTimeout

setReadTimeout

EDIT: ああ、いくつかのコード。私はorg.apache.httpパッケージに精通していないのですが、org.apache.http.client.methods.HttpGetはインターフェイスorg.apache.http.client.methods.AbortableHttpRequestから継承しているので、というメソッドを使用できます。メソッドはgetConnection (long timeout, TimeUnit tunit)です。本当に、私はちょうどここでストローで握っているだけです - もしあなたがHTTPで何か基本的なことをしているのであれば、java.net.HttpUrlConnectionに行きます。

+0

私の編集した投稿で使用しているインポートを確認してください – jonney

関連する問題