2010-12-16 73 views
0

我實現了一個try塊,做一些網絡請求,但每當它拋出一個異常,例如有超時之一,android的應用程序將顯示一條消息說安卓顯示我自己的錯誤消息I來自一個異常

對不起:應用程序已經意外停止,請重試。

呈現給用戶的唯一選項是強制關閉按鈕。我想趕上這個異常,並簡單地顯示我自己的錯誤消息,並讓用戶再次嘗試連接,而不是用戶不得不關閉應用程序。

這裏是下面的代碼:

所有我想要做的是返回null一個異常被捕獲,什麼調用這個不斷類會做自己的錯誤處理類似這樣的後:

if(postRequest == null){ display error message} 

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(); 

      httpclient.getParams().setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, 1); 
      //httpclient.getParams().setParameter(CoreConnectionPNames.SO_TIMEOUT, 10000); 
      httpclient.getParams().setParameter(CoreConnectionPNames.SO_TIMEOUT, 5); 
      Log.d(TAG, "httpclient.getParams().setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, 5000);"); 
      post = new HttpPost(url); 
//   ClientConnectionRequest connRequest = new ManagedClientConnection(); 
//   post.setConnectionRequest((ClientConnectionRequest) connRequest.getConnection(3000, TimeUnit.MILLISECONDS)); 

      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 (SocketTimeoutException e) { 
      e.printStackTrace(); 
      Log.d(TAG, "SocketTimeoutException e = " + e.toString()); 
      return null; 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
      Log.d(TAG, "IOException e = " + e.toString()); 
      return null; 
     } 

    } 

回答

1

由於未捕獲的異常而出現強制關閉對話框。由於你不是自己拋出一個檢查的異常,這是由於運行時異常,很可能是一個空指針。這意味着代碼中存在導致此錯誤而不是網絡錯誤的錯誤。

爲了找到問題,您需要知道拋出異常的類型及其消息。您可以在LogCat中看到這些信息 - 如果您使用的是Eclipse,則可以在調試視圖中使用它。

+0

拋出異常的類型是java.net.SocketTimeoutException,我已經捕獲了。 – jonney 2010-12-16 10:24:06

+0

固定。就像你說的那樣,我的網絡代碼沒有什麼新意,我期待着來自另一個使用這個網絡代碼的課程並修復它。隊友的歡呼聲 – jonney 2010-12-16 10:30:54