2010-12-16 35 views
0

我開發了一種方法,使網絡http請求,並等待響應。我現在想要處理一個場景,如果http響應需要更長的時間,我想通過拋出某種異常和錯誤來取消/終止connectinn。java:拋出異常或錯誤,如果網絡通話時間過長?

即時通訊不問如何拋出異常和錯誤,我知道,我只是問我怎麼能如何時間多久它採取我檢索一個HTTP響應?下面

僞是這樣的:

  1. 啓動一些定時器
  2. 進行HTTP請求
  3. 等待HTTP請求
  4. 如果響應犯規X後得到恢復,拋出的錯誤/異常。

他們一直在做的情況下,當我做了一個HTTP請求需要一兩分鐘之後,終於拋出一個異常,但我希望拋出這個異常更快,而不是應用程序凍結和等待3-4分鐘。

在此先感謝

林這樣做了Android應用程序,以便使用Android特定庫或Java 5米的庫應該sufficiant關於如何實現這樣的一個例子。

編輯:這裏是我的http請求的代碼看起來像使用Apache庫:

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 – 2017-12-12 20:38:12

回答

1

假設您使用的是HttpClient 4.0.x,那麼控制這種事情的方法是設置connection parameters

+0

謝謝。我設法讓它工作。歡呼聲 – jonney 2010-12-16 10:11:55

+0

不客氣:-) – 2010-12-16 10:15:10

0

你可以使用一個變量Future並使用Future.get(long timeout, TimeUnit unit)

......拋出某種異常的是一條錯誤

我想諮詢您不拋出Error如果這是你在談論這裏。

Error文檔:

一個錯誤是Throwable的子類,表示嚴重的問題,合理的應用程序不應該試圖捕獲

+0

我的意思是錯誤是向用戶顯示錯誤消息。看我的編輯我的http請求代碼,以及它如何看起來像 – jonney 2010-12-16 09:02:56

2

您使用的是java.net.HttpUrlConnectionHttpUrlConnectionjava.net.UrlConnection的子類,其具有方法setConnectTimeout(int)setReadTimeout(int)。一旦在connect()InputStream.read()上超過這些閾值,則將拋出IOException

查看Javadoc在...

setConnectTimeout

setReadTimeout

編輯: 啊,有些代碼。恐怕我對org.apache.http包不太熟悉,但看起來org.apache.http.client.methods.HttpGet繼承自接口org.apache.http.client.methods.AbortableHttpRequest,所以你可以使用方法setConnectionRequest(ClientConnectionRequest connRequest),它有一個方法getConnection (long timeout, TimeUnit tunit)。真的,我只是在抓着吸管 - 如果你只是用HTTP做一些基本的事情,我會說去java.net.HttpUrlConnection

+0

檢查導入im使用我編輯的帖子 – jonney 2010-12-16 09:22:41