2013-06-04 77 views
0

whoaa 我真的需要幫助,爲什麼我的代碼結果是這樣的? 這是我的代碼:android.os.NetworkOnMainThreadException android調用webservice

HttpClient httpClient = new DefaultHttpClient(); 
     HttpPost httpPost = new HttpPost(URL);  
try{ 
      HttpResponse response = httpClient.execute(httpPost); 
      String jsonResult = convertStreamToString((response.getEntity().getContent())).toString(); 
      JSONObject obj = (JSONObject) new JSONTokener(jsonResult).nextValue(); 
      JSONObject obj2 = obj.getJSONObject("GetRingkasObjekPajak_SingleResult"); 
      String nameWP = obj2.getString("NM_WP"); 
      TextView tv = (TextView)findViewById(R.id.dummy_text_three); 
      tv.setText(jsonResult); 
     }catch (MalformedURLException e) { 
      // URL is invalid 
      TextView tv = (TextView) findViewById(R.id.dummy_text_three); 
      tv.setText("url invalid"); 
     } catch (SocketTimeoutException e) { 
      // data retrieval or connection timed out 
      TextView tv = (TextView) findViewById(R.id.dummy_text_three); 
      tv.setText("RTO"); 
     } catch (IOException e) { 
      // could not read response body 
      // (could not create input stream) 
      TextView tv = (TextView) findViewById(R.id.dummy_text_three); 
      tv.setText("couldnt read response"); 
     } catch (JSONException e) { 
      // response body is no valid JSON string 
      TextView tv = (TextView) findViewById(R.id.dummy_text_three); 
      tv.setText("json response fail"); 
     }catch (Exception e) { 
      // TODO: handle exception 
      TextView tv = (TextView) findViewById(R.id.dummy_text_three); 
      tv.setText(e.toString()); 
     } 

我也開始加入網絡的權限

請幫我 如何提高我的代碼,所以這個問題就迎刃而解了。

+0

其N/W在主線程異常轉向的asynctasks內部網絡的任務就在後臺將通過刪除嚴格的模式策略告訴你可以擺脫異常此異常from3.o設備,但它能夠更好地移動到異步任務 –

+2

掛上! *讓我爲你的谷歌!* http://bit.ly/18KwgKT – Swayam

回答

3

這是一個異步任務的例子...希望它對你有幫助。

private class YourAsyncTaskClass extends AsyncTask<String, Void, String> { 

     @Override 
     protected String doInBackground(String... params) { 
      //your http network call here. 
      return null; 
     }  

     @Override 
     protected void onPostExecute(String result) { 
      //update your ui here 
     } 

     @Override 
     protected void onPreExecute() { 
      //do any code before exec 
     } 

     @Override 
     protected void onProgressUpdate(Void... values) { 
       //If you want to update a progress bar ..do it here 
     } 
} 

最後調用這個類從要像任何地方..

new YourAsyncTaskClass().execute(); 
+0

我希望有任何例子 – yozawiratama

+0

這[教程](http://www.vogella.com/articles/AndroidBackgroundProcessing/article.html)是非常好...我是從同一個人那裏學到的。 – amalBit

3

您無法從主UI線程執行網絡操作。你需要在不同的線程中完成與網絡相關的任務。更好地利用AsyncTask

按照doc

當應用程序試圖在其主線程執行 網絡操作時引發的異常。

這僅適用於針對Honeycomb SDK或 的應用程序。針對早期SDK版本的應用程序允許在其主要事件循環線程上執行聯網,但不鼓勵 。

0

NetworkOnMainThreadException:當應用程序試圖在其主線程進行網絡操作時引發的異常。

在Android開發人員網站上有一篇關於Painless Threading的文章,對此進行了很好的介紹,並且將爲您提供比實際提供的更好的深度here

AsyncTask中運行您的代碼。

您可以通過很好的示例瞭解關於asyncTask here的最佳解釋。

0

調用內部aynctask你的web服務。

private class NetworkTask extends AsyncTask<String, Void, String> { 

     @Override 
     protected String doInBackground(String... params) { 
     // call your network operation here 
     }  




} 
相關問題