2013-06-15 2 views
1

Я пытаюсь получить доступ к сети Android, запустив TCP-сервер. Но когда я создаю новую тему, либо Thread t = new Thread(runnable); t.start();Как использовать другой поток, чтобы остановить NetworkOnMainThreadException?

или FutureTask я все еще получаю networkonmainthreadexception ...

+2

Вы работаете в сети, связанной с нитью ui, используете asynctask или создаете новую цепочку. http://developer.android.com/reference/android/os/NetworkOnMainThreadException.html – Raghunandan

+0

Я вижу, что вы новичок здесь. Пожалуйста, сначала найдите свой вопрос, так как большую часть времени уже будут ответы, и это один из них. Попробуйте создать фоновый поток, как указал @Raghunandan, и задайте более конкретный вопрос с вещами, которые вы пробовали, и соответствующий код – codeMagic

ответ

1

Вы должны сделать фактическую сеть ввода-вывода на функцию запуска() из работоспособной в резьбе , Вы не просто создаете поток, а затем выполняете IO.

+0

интересный момент. У меня есть некоторый сетевой код при построении класса runnable, я переместлю его в метод run. Я думаю, что это, наверное, причина! – james

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); 
     } 

добавить этот код не даст вам сети в основном исключении потока.

+0

Я использовал asynctask, и это работало нормально. но мне нужно несколько потоков, и я не думаю, что asynctask - лучшее решение для этого ... но спасибо за ответ – james

Смежные вопросы