2012-11-17 30 views
1

可能重複:
Android app doesn’t work on Android 4HttpURLConnection的連接上4.0和4.1,但不()異常2.3.3

我工作的一個Android應用程序。試圖找到幾個小時的解決方案。當我運行模擬器2.3.3時,我的應用可以正常運行數據庫和服務器,但是在4.0或4.1或2.3.3以上的任何版本上都沒有問題。該應用程序在此方法中引發異常:嘗試執行connection.connect();時出現異常,請幫助。

public void sendOutputLine(URL url, String outputLine) { 
    try { 
     connection = (HttpURLConnection) url.openConnection(); 
     Log.d(LogInActivity.DEBUG_TAG, "1"); 
     connection.setDoInput(true); 
     Log.d(LogInActivity.DEBUG_TAG, "2");  
     connection.setDoOutput(true); 
     Log.d(LogInActivity.DEBUG_TAG, "3");  
     connection.setRequestMethod("POST"); 
     Log.d(LogInActivity.DEBUG_TAG, "4");  
     connection.setFixedLengthStreamingMode(outputLine.length()); 
     Log.d(LogInActivity.DEBUG_TAG, "5");  
     connection.connect(); 
     Log.d(LogInActivity.DEBUG_TAG, "6");  
     out = connection.getOutputStream(); 
     PrintWriter pw = new PrintWriter(new OutputStreamWriter(out)); 
     pw.print(outputLine); 
     pw.flush(); 
     out.close(); 
    } catch (SocketTimeoutException e) { 
     Log.d(LogInActivity.DEBUG_TAG, 
       "SocketTimeoutException sendOutputLine(): " + e.getMessage());   
    } catch (ProtocolException e) { 
     Log.d(LogInActivity.DEBUG_TAG, 
       "Protocol exception sendOutputLine(): " + e.getMessage()); 
    } catch (IOException e) { 
     Log.d(LogInActivity.DEBUG_TAG, "IO exception sendOutputLine(): " 
       + e.getMessage()); 
    } catch (Exception e) { 
     Log.d(LogInActivity.DEBUG_TAG, 
       "Exception bommed client: " + e.getMessage()); 
    } 
} 

的logcat:

11-17 13:19:11.710: D/SocialFamilyTree(847): outputLint: Login%[email protected]%57963634 
11-17 13:19:11.710: D/SocialFamilyTree(847): 1 
11-17 13:19:11.710: D/SocialFamilyTree(847): 2 
11-17 13:19:11.710: D/SocialFamilyTree(847): 3 
11-17 13:19:11.710: D/SocialFamilyTree(847): 4 
11-17 13:19:11.710: D/SocialFamilyTree(847): 5 
11-17 13:19:11.740: D/SocialFamilyTree(847): Exception bommed client: null 

編輯: 我明白了,所以我需要使用AsyncTask

如何使用AsyncTask完成這個任務?通過這種方式

回答

0

使用的AsyncTask ...

public class getConnection extends AsyncTask<String, Void, Void> 
    { 


      @Override 
      protected void onPreExecute() 
      { 
       super.onPreExecute(); 
       Utils.clearDialogs(); 
       Utils.showActivityViewer(Mainctivity.this); 
      } 

      @Override 
      protected Void doInBackground(String... arg0) 
      { 

      try 
      { 
        connection = (HttpURLConnection) url.openConnection(); 

        Log.d(LogInActivity.DEBUG_TAG, "1"); 
        connection.setDoInput(true); 
        Log.d(LogInActivity.DEBUG_TAG, "2");  
        connection.setDoOutput(true); 
        Log.d(LogInActivity.DEBUG_TAG, "3");  
        connection.setRequestMethod("POST"); 
        Log.d(LogInActivity.DEBUG_TAG, "4");  
        connection.setFixedLengthStreamingMode(outputLine.length()); 
        Log.d(LogInActivity.DEBUG_TAG, "5");  
        connection.connect(); 
        Log.d(LogInActivity.DEBUG_TAG, "6");  
        out = connection.getOutputStream(); 
        PrintWriter pw = new PrintWriter(new OutputStreamWriter(out)); 
        pw.print(outputLine); 
        pw.flush(); 
        out.close(); 
      } 
      catch (Exception e) 
      { 
      e.printStackTrace(); 
      } 

      return null; 
      } 

      @Override 
      protected void onPostExecute(Void result) 
      { 
       super.onPostExecute(result); 
       Utils.hideActivityViewer(); 

      } 
      catch (Exception e) 
      { 
      Log.v("log", e.toString()); 
      } 
      } 

      } 
+0

** Utils **來自哪裏? –

+0

這是類......我宣佈了進度對話框的顯示和隱藏功能 –

0

不要只是一味地捕獲異常。您通過隱藏錯誤來掩蓋整個問題。如果我不得不猜測,我會說你遇到了NetworkOnMainThreadException,因爲你可能沒有在後臺線程上運行,但是不可能用你提供的信息來判斷。

AsyncTask是解決NetworkOnMainThreadException問題的一種方法,但它不是唯一的方法,也沒有證據表明您的實際問題。