2010-01-12 36 views
16

Tôi đã có ứng dụng Android của mình sử dụng HttpClient để tiếp cận servlet được triển khai trên Tomcat của tôi. Nó được cài đặt trên HTC Magic của tôi.HttpClient trên Android: NoHttpResponseException thông qua UMTS/3G

Nếu tôi khởi chạy nó khi được kết nối trên Wifi: nó hoạt động. Nếu tôi khởi động nó khi kết nối với 3G (mạng dữ liệu GSM): nó không hoạt động nhưng servlet của tôi đã đạt được. Nói một cách khác, có vẻ như điện thoại của tôi không bao giờ có được câu trả lời:

Technical problem while receiving response. 
org.apache.http.NoHttpResponseException: The target server failed to respond 
    at org.apache.http.impl.conn.DefaultResponseParser.parseHead(DefaultResponseParser.java:85) 
    at org.apache.http.impl.io.AbstractMessageParser.parse(AbstractMessageParser.java:174) 
    at org.apache.http.impl.AbstractHttpClientConnection.receiveResponseHeader(AbstractHttpClientConnection.java:179) 
    at org.apache.http.impl.conn.DefaultClientConnection.receiveResponseHeader(DefaultClientConnection.java:235) 
    at org.apache.http.impl.conn.AbstractClientConnAdapter.receiveResponseHeader(AbstractClientConnAdapter.java:259) 
    at org.apache.http.protocol.HttpRequestExecutor.doReceiveResponse(HttpRequestExecutor.java:279) 
    at org.apache.http.protocol.HttpRequestExecutor.execute(HttpRequestExecutor.java:121) 
    at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:410) 
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555) 
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487) 
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465) 

Nếu tôi sử dụng các trình duyệt web thông qua 3G để kích hoạt trang kiểm tra HTML được đóng gói với servlet của tôi, nó đạt đến servlet cùng với thành công (trang nhận được phản hồi).

Làm cách nào để gỡ lỗi HttpClient hoặc yêu cầu xóa tất cả mọi thứ?

Có ai đó có manh mối về những gì đang xảy ra không?

+0

Bạn đã kiểm tra nhật ký máy chủ của mình để xem liệu yêu cầu có được thực hiện qua dây không? Nếu có, nhật ký của bạn có cho bạn biết điều gì không (ví dụ: lỗi phía máy chủ)? – CommonsWare

+0

Máy chủ nhận yêu cầu (rất nhanh) và đưa ra một phản hồi thành công, theo cách rất giống với yêu cầu khi đến trên wifi. Sẽ hiệu quả hơn nếu có thể gỡ lỗi HttpClient ... Ngoại lệ được ném sau một thời gian dài, nhiều hơn hoặc ít hơn 10 phút, vì vậy tôi đoán, không có gì thực sự quay lại thiết bị. Nếu đúng, cái gì đó đang mất phản ứng của tôi trong không khí. Mạng GSM của tôi có thể lọc không? – Hubert

+0

Thật thú vị, có một máy chủ mực được cài đặt trên proxy.cwg.net có vẻ là nguyên nhân. Nhưng tại sao nó hoạt động với trang HTML thử nghiệm và không phải với HttpClient trong cùng một điều kiện? – Hubert

Trả lời

11

tôi cuối cùng đã thoát khỏi vấn đề này: chỉ cần một tiêu đề HTTP mà bị tác động nặng xử lý bởi một máy chủ mực trên đường:

mong đợi: 100-Tiếp tục

Nó có vẻ là có theo mặc định với DefaultHttpClient trên Android SDK. Để giải quyết vấn đề này, chỉ cần thêm mã đó vào mã của bạn:

HttpProtocolParams.setUseExpectContinue(httpClient.getParams(), false); 
13

Tôi cũng gặp sự cố này. Nó chỉ xảy ra không thường xuyên, thường là trên một yêu cầu http ban đầu. Các yêu cầu tiếp theo sẽ hoạt động tốt. Thêm setUseExpectContinue dường như không hoạt động.

Giải pháp trong trường hợp của tôi là để thêm một handler retry rằng sẽ thử lại yêu cầu về ngoại lệ cụ thể:

 HttpProtocolParams.setUseExpectContinue(client.getParams(), false); 

     HttpRequestRetryHandler retryHandler = new HttpRequestRetryHandler() { 

      public boolean retryRequest(IOException exception, int executionCount, 
        HttpContext context) { 
       // retry a max of 5 times 
       if(executionCount >= 5){ 
        return false; 
       } 
       if(exception instanceof NoHttpResponseException){ 
        return true; 
       } else if (exception instanceof ClientProtocolException){ 
        return true; 
       } 
       return false; 
      } 
     }; 
     client.setHttpRequestRetryHandler(retryHandler); 
+0

Đây chính là vấn đề tôi gặp phải .. không may, máy chủ nhận được yêu cầu đầu tiên và thay đổi một số trạng thái .. gửi yêu cầu đó lại thực sự bẻ khóa những điều .. – danb

+0

@PTG Không hoạt động trong trường hợp của tôi. Tôi đặt max executionCount thành 50 để kiểm tra xem có hoạt động sau quá nhiều lần thử lại hay không. Nhưng nó không. Bạn có ý tưởng nào khác không? BTW, tôi sử dụng nó với proxy và sau đó chỉ nhận được ngoại lệ này. – Geek

Các vấn đề liên quan