问题如下面代码中所述,执行到conn.getOutputStream().write(content.getBytes());//出错了 抛出networkonmainthreadexception异常 请问大侠们是怎么回事啊
代码如下:InputStream in = NumberService.class.getResourceAsStream("mobilesoap.xml");  
                byte[] data = StreamUtil.load(in);  
                String content = new String(data);  
                content = content.replace("$number", number);  
                  
                // 创建连接对象, 设置请求头, 按照Webservice服务端提供的要求来设置   
                URL url = new URL("http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx");  
                HttpURLConnection conn = (HttpURLConnection) url.openConnection();  
                conn.setConnectTimeout(5000);  
                conn.setRequestProperty("Host", "webservice.webxml.com.cn"); 
                //conn.setRequestProperty("Content-type", "application/x-java-serialized-object");
                conn.setRequestProperty("Content-Type", "application/soap+xml; charset=utf-8");  
                conn.setRequestProperty("Content-Length", content.getBytes().length + "");  
                conn.setRequestMethod("POST");  
                conn.setUseCaches(false);
                // 输出数据   
                conn.setDoOutput(true); 
                conn.setDoInput(true);
                //conn.connect();
                
                conn.getOutputStream().write(content.getBytes());//出错了 抛出networkonmainthreadexception异常  
                conn.getOutputStream().flush();
                conn.getOutputStream().close();                  
//              // 获取服务端传回的数据, 解析XML, 得到结果   
                XmlPullParser parser = Xml.newPullParser();  
                parser.setInput(conn.getInputStream(), "UTF-8");  
                  
                for (int type = parser.getEventType();type!=XmlPullParser.END_DOCUMENT;type=parser.next())   
                  if(type==XmlPullParser.START_TAG&&parser.getName().equals("getMobileCodeInfoResult")){  
                      return parser.nextText();  
                  }  
                return "没有找到此号码";  

解决方案 »

  1.   

    NetworkOnMainThreadException
    提示你不要在主线程中访问网络。把要访问的网络单独放在一个线程中:new Thread(){
        @Override
        public void run()
        {
            //把你上面那段网络访问的代码放在这里     
        }
    }.start();
      

  2.   

    如果是临时测试不是最终发布版本可以通过去掉strictMode来解决
    办法是在oncreate中使用如下代码
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
     
        StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
        StrictMode.setThreadPolicy(policy);  
    }
    最终的解决办法还是通过线程来请求网络数据,给你一个使用asyncTask的例子public void downloadHtml(View view) throws IOException{
    DownloadHtmlTask task = new DownloadHtmlTask();
    task.execute(new String[] { "http://www.bcoder.com" });
    }
     
    private class DownloadHtmlTask extends AsyncTask<String, Void, String> {
        @Override
        protected String doInBackground(String... urls) {
            String response = "";
            InputStream in = null;
            for (String url : urls) {
                DefaultHttpClient client = new DefaultHttpClient();
                HttpGet httpGet = new HttpGet(url);
                try {
                    URL urlget = new URL(url);
                    HttpURLConnection conn = (HttpURLConnection)urlget.openConnection();
     
                    conn.connect();
     
                    in = (conn.getInputStream());
                    BufferedReader buffer = new BufferedReader(new InputStreamReader(in));
                    String s = "";
                    while ((s = buffer.readLine()) != null) {
                        response += s;
                    }                       
     
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            return response;
        }
     
        @Override
        protected void onPostExecute(String result) {
            TextView textView =  (TextView)findViewById(R.id.textView1);;
            textView.setText(result);
        }
    }
      

  3.   

    您好 这是onCreate函数 然后 我在里面直接调用的NumberService的getLocation函数,这样就跑出了networkonmainthreadexception异常 应该是重新创建一个线程 然后在线程里面调用NumberService的getLocation函数然后返回数据?
    代码:
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_quality);
    ListView lv = (ListView) findViewById(R.id.quality_list_view);
    String phoneNumble = null;
    try {
    phoneNumble = (new NumberService()).getLocation("18661870109");
    } catch (Exception e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    System.out.print(phoneNumble);
      

  4.   

    new Thread(){
       @Override
       public void run()
       {
       String phoneNumble = null;
     try {
     phoneNumble = (new NumberService()).getLocation("18661870109");
     } catch (Exception e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
     }
     System.out.print(phoneNumble);  
      }
    }.start();