如何使用另一个线程来停止NetworkOnMainThreadException?

时间:2013-06-15 19:08:53

标签: java android

我试图通过启动TCP服务器来访问Android网络。但是当我创建一个新的线程时,要么通过     Thread t = new Thread(runnable); t.start();

FutureTask我仍然得到networkonmainthreadexception ...

2 个答案:

答案 0 :(得分:2)

使用AsyncTask执行与网络相关的操作

例如:

private class DownloadWebPageTask extends AsyncTask<String, Void, String> {
    @Override
    protected String doInBackground(String... urls) {
      String response = "";
      for (String url : urls) {
        DefaultHttpClient client = new DefaultHttpClient();
        HttpGet httpGet = new HttpGet(url);
        try {
          HttpResponse execute = client.execute(httpGet);
          InputStream content = execute.getEntity().getContent();

          BufferedReader buffer = new BufferedReader(new InputStreamReader(content));
          String s = "";
          while ((s = buffer.readLine()) != null) {
            response += s;
          }

        } catch (Exception e) {
          e.printStackTrace();
        }
      }
      return response;
    }

    @Override
    protected void onPostExecute(String result) {
      textView.setText(result);
    }
  } 

或者你可以这样做,虽然不推荐

    if (android.os.Build.VERSION.SDK_INT > 9) {
        StrictMode.ThreadPolicy policy = 
                new StrictMode.ThreadPolicy.Builder().permitAll().build();
        StrictMode.setThreadPolicy(policy);
        }

添加此代码将不再为主线程异常提供网络。

答案 1 :(得分:1)

您必须在线程中runnable的run()函数上执行实际的网络IO。您不仅要创建一个线程,还要执行IO。