2013-10-16 128 views
0

我正在使用與安裝在智能手機上的我的android應用進行通信的服務器。該應用程序正在本地環境中使用,它使用計算機的本地IP通過WiFi與Apache服務器進行通信。如何知道連接未建立到服務器?

問題是本地ips會不時發生變化,當這種情況發生幾次之後,由於操作超時,應用程序因爲某個NullPointer異常而崩潰。所以我想知道是否有辦法,要知道連接到服務器的時間不成功,並且如果有辦法(在確認操作超時之後)採取一些措施,以便應用程序不會凍結。

日Thnx提前

我這個用戶代碼來連接:

HttpClient httpClient = new DefaultHttpClient(); 
     HttpPost httpPost = new HttpPost(url); 


     JSONObject jo = new JSONObject(); 
     jo.put("tag",tag); 




     // Prepare JSON to send by setting the entity 
     httpPost.setEntity(new StringEntity(jo.toString(), "UTF-8")); 

     // Set up the header types needed to properly transfer JSON 
     httpPost.setHeader("Content-Type", "application/json"); 
     httpPost.setHeader("Accept-Encoding", "application/json"); 
     httpPost.setHeader("Accept-Language", "en-US"); 
     HttpResponse response = httpClient.execute(httpPost); 
     HttpEntity entity = response.getEntity(); 


      is = entity.getContent(); 

而從這個最後返回一個JSONObject,這事後我分析得到我所需要的。

回答

1

你需要使用異步任務做任何HTTP調用,否則你的應用程序將凍結,直到操作完成:

開始用簡單的sysnc類來執行你的HTTP請求。 還需要某種處理程序才能獲得結果,一旦任務完成,您可以使用用戶界面或Android handler,我喜歡界面!

class MyHttpTask extends AsyncTask<View, View, String> 
{ 
    String url = null; 
    HttpResultHandler handler = null; 
      public final static int ERROR_CONNECTION_TIMEOUT = 1000; 
      public final static int ERROR_SOCKET_TIMEOUT  = 2000; 
      private int error_code = 0; 

    public MyHttpTask(String url, HttpResultHandler handler) 
    { 
     this.url = url; 
     this.handler = handler; 
    } 

    @Override 
    protected String doInBackground(View... arg0) 
    { 
     try 
     { 
      HttpClient httpClient = new DefaultHttpClient(); 
      HttpPost httpPost = new HttpPost(url); 

      JSONObject jo = new JSONObject(); 
      jo.put("tag", tag); 

      // Prepare JSON to send by setting the entity 
      httpPost.setEntity(new StringEntity(jo.toString(), "UTF-8")); 

      // Set up the header types needed to properly transfer JSON 
      httpPost.setHeader("Content-Type", "application/json"); 
      httpPost.setHeader("Accept-Encoding", "application/json"); 
      httpPost.setHeader("Accept-Language", "en-US"); 
      HttpResponse response = httpClient.execute(httpPost); 
      HttpEntity entity = response.getEntity(); 

      InputStream is = entity.getContent(); 

      String result = // read your stream as string or any you might prefer byte[] 

      return result; 
     } 
     catch (UnresolvedAddressException e) 
     { 
      return null; 
     } 
     catch (UnknownHostException e) 
     { 
      return null; 
     } 
      catch (ConnectTimeoutException e) 
      { 
        error_code = ERROR_CONNECTION_TIMEOUT; 
        return null; 
      } 
      catch(SocketTimeoutException e) 
      { 
        error_code = ERROR_SOCKET_TIMEOUT; 
        return null; 
      } 
     catch (IOException e) 
     { 
      return null; 
     } 
     catch (Exception e) 
     { 
      return null; 
     } 
    } 

    @Override 
    protected void onPostExecute(String result) 
    { 
     if (result!=null) 
     { 
      handler.onSuccess(result); 
     } 
     else 
     { 
      handler.OnFailure(errorCode); 
     } 
    } 
} 

這裏是一個簡單的界面,報告成功或失敗的操作:

static interface HttpResultHandler 
{ 
    public void onSuccess(String result); 

    public void OnFailure(int errorCode); 
} 

來測試您的解決方案:

private void testHttpTask() 
{ 
    // here you can block the UI using any type of progress bar 
    String url = "http://www.something.com"; 
    new MyHttpTask(url, new HttpResultHandler() 
    { 

     @Override 
     public void onSuccess(String result) 
     { 
      // TODO Auto-generated method stub 
       // here you get success result 
      // dismiss any loading progress bars 
     } 

     @Override 
     public void OnFailure(int error_code) 
     { 
      // TODO Auto-generated method stub 
        // here you get failure 
      // dismiss any loading progress bars, and do your recovery stuff 

     } 
    }).execute(); 
} 
+0

我已經使用了異步任務,我連接代碼,在一個單獨的文件上實現。我想你正試圖給我一種處理錯誤的方法,但我想我不明白這是怎麼回事。我的主要問題是,我用什麼對象來處理超時狀態,以便我可以操縱它。 – user1732457

+0

對於每種類型的異常都有一個原因,對於ConnectTimeoutException意味着連接到服務器的嘗試超時。並且對於SocketTimeoutException表示與服務器的連接超時。我已經更新了代碼,以便在失敗的情況下返回錯誤代碼,現在當您發現錯誤是由於超時造成的,然後執行額外的代碼,例如重試連接。 –

0

把你的代碼放在你建立連接的地方。從你描述的這聽起來你需要設置你的http參數,以便你有一個確定的超時,然後捕捉它的一些方法。

相關問題