2012-05-24 12 views
0

웹 서버에서 JSON 데이터를 보내고이 방법으로 응답을받습니다.웹 서버에 httpclient.execute 예외가 발생했습니다.

public JSONObject postOnServer(JSONObject json) { 

    HttpResponse response; 
    JSONObject res = null; 

    HttpClient httpclient = new DefaultHttpClient(); 
    HttpConnectionParams.setConnectionTimeout(httpclient.getParams(), 10000); 
    HttpPost httpPost = new HttpPost(PATH); 

    try { 

     //StringEntity stringEntity = new StringEntity("json", String.valueOf(json)); 
     ByteArrayEntity postMessage = new ByteArrayEntity(json.toString().getBytes("UTF8")); 
     httpPost.setEntity(postMessage); 
     response = httpclient.execute(httpPost); 

     if (response.getStatusLine().getStatusCode() == 200) { 

      InputStream instream = response.getEntity().getContent(); 
      try { 
       res = new JSONObject(convertStreamToString(instream)); 
      } catch (JSONException e) { 
       // TODO Auto-generated catch block 
       Log.i("Response JSON", e.toString()); 
      } 

     } else { 

      res = new JSONObject(); 
      try { 
       res.put("error", "Unable to load page."); 
      } catch (JSONException e) { 
       // TODO Auto-generated catch block 
      } 

     } 
    } catch (IOException ex) { 

     Log.i("Connection.postOnServer", "1.try exception: "+ex); 
     res = new JSONObject(); 
     try { 
      res.put("error", "Synchronization is not enable: Connection has aborted."); 
     } catch (JSONException e) { 
      Log.i("Connection.postOnServer", "put exception: "+e); 
     } 

    } 

    return res; 
} 

그러나 항상

05-24 10:58:51.635: E/AndroidRuntime(4709): FATAL EXCEPTION: main 
05-24 10:58:51.635: E/AndroidRuntime(4709): android.os.NetworkOnMainThreadException 
05-24 10:58:51.635: E/AndroidRuntime(4709):  at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1099) 
05-24 10:58:51.635: E/AndroidRuntime(4709):  at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:84) 
05-24 10:58:51.635: E/AndroidRuntime(4709):  at libcore.io.IoBridge.connectErrno(IoBridge.java:138) 
05-24 10:58:51.635: E/AndroidRuntime(4709):  at libcore.io.IoBridge.connect(IoBridge.java:112) 
05-24 10:58:51.635: E/AndroidRuntime(4709):  at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:192) 
05-24 10:58:51.635: E/AndroidRuntime(4709):  at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:459) 
05-24 10:58:51.635: E/AndroidRuntime(4709):  at java.net.Socket.connect(Socket.java:842) 
05-24 10:58:51.635: E/AndroidRuntime(4709):  at org.apache.http.conn.scheme.PlainSocketFactory.connectSocket(PlainSocketFactory.java:119) 
05-24 10:58:51.635: E/AndroidRuntime(4709):  at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:144) 
05-24 10:58:51.635: E/AndroidRuntime(4709):  at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164) 
05-24 10:58:51.635: E/AndroidRuntime(4709):  at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119) 
05-24 10:58:51.635: E/AndroidRuntime(4709):  at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360) 
05-24 10:58:51.635: E/AndroidRuntime(4709):  at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555) 
05-24 10:58:51.635: E/AndroidRuntime(4709):  at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487) 
05-24 10:58:51.635: E/AndroidRuntime(4709):  at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465) 

사람의 생각이이 예외와 일치 response = httpclient.execute(httpPost);에 종료, 어떻게 그것을 해결하기 위해? 내가 catch (IOException)를 사용하면 갈증이 생기지 만 응용 프로그램은 파괴됩니다. catch (Exception) 응용 프로그램을 사용하면 아무런 조치없이 계속 진행됩니다. 데이터를 보내려면 어떻게해야합니까?

+1

http://stackoverflow.com/a/4822122/1251715 [HonyComb 및 DefaultHttpClient (의 동일한 문제 – Th0rndike

+0

중복 가능성 http://stackoverflow.com/questions/4821845/honycomb-and -defaulthttpclient) – Marijn

답변

2

Android에서는 사용자 인터페이스 스레드에서 네트워크 요청을 실행할 수 없습니다. 이는 요청이 실행되는 동안 인터럽트가 걸리지 않도록하기위한 것입니다. 별도의 스레드에서 요청을 실행해야합니다. 여기서 예이다 :

new Thread(new Runnable() { 
    //Thread to stop network calls on the UI thread 
    public void run() { 
     //Request the HTML 
     try { 
      HttpParams httpParameters = new BasicHttpParams(); 
      HttpConnectionParams.setConnectionTimeout(httpParameters, TIMEOUT_CONNECTION); 
      HttpConnectionParams.setSoTimeout(httpParameters, TIMEOUT_SOCKET); 

      HttpClient client = new DefaultHttpClient(httpParameters); 
      HttpGet request = new HttpGet(getString(R.string.url)); 
      HttpResponse response = client.execute(request); 

      //Do something with the response 
     } 
     catch (IOException e) { 
      Log.e("Tag", "Could not get HTML: " + e.getMessage()); 
     } 
    } 
}).start(); 
+1

그리고 내가 그것을하는 곳에서 어떻게 응답을 돌려 주나요? – Vaek

+0

그렇지 않습니다. 응답을 리턴 한 경우 호출 메소드는 응답을 기다려야하므로 사용자가 스레드하지 않을 수도 있음을 의미합니다. 일어날 필요가있는 모든 업데이트, 당신은 네트워크 통화를하는 스레드에서해야합니다. –

관련 문제