2012-05-13 2 views
0

Я пытаюсь закодировать простое приложение чата для Android, поэтому у меня есть сервер чата, и я пытаюсь подключиться к нему. Таким образом, в главном классе у меня естьВыполнение сетей в Android от AsyncTask дает NetworkOnMainThreadException

final EditText etHost = (EditText) findViewById(R.id.entry1); 
final EditText etPort = (EditText) findViewById(R.id.entry2); 
final EditText messageBoard = (EditText) findViewById(R.id.editText1); 
final EditText etSend = (EditText) findViewById(R.id.editText2); 

soEd = new SocketAndEditText(etHost, etPort, messageBoard, etSend); 
SetNetworking net = new SetNetworking(); 
SocketAndEditText net.execute(soEd); 
final Button sendButton = (Button) findViewById(R.id.button2); 

sendButton.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       Messager mes = new Messager(); 
       mes.execute(soEd); 
      } 
     }); 

SocketAndEditText класс, где я просто держать гнездо и четыре EditText компоненты. Идея состоит в том, что SetNetworking установит сетевое соединение, и Messager будет отправлять сообщения. Оба класса реализации AsyncTask:

public class SetNetworking extends AsyncTask<SocketAndEditText, Void, Void> { 
... 

public class Messager extends AsyncTask<SocketAndEditText, Void, Void> { 
... 

Но странно в onPostExecute(Void result) в Messager, когда я пытаюсь сделать даже очень простую вещь, как

try { 
    InetAddress address1 = InetAddress.getByName("130.237.161.23"); 
    boolean reachable = address1.isReachable(4456); 
    messageBoard.setText("Is host reachable?" + reachable); 
} catch (Exception e) { 
    messageBoard.setText("Test not working! " + e.toString()); 
} 

я получаю это:

тест не работает! android.os.NetworkOnMainThreadException

Почему, так как он находится в AsyncTask, а не в основном потоке?

+2

onPostExecute делается на основной резьбе ... – Selvin

ответ

1

Вы не можете делать сетевой ввод-вывод в onPostExecute из AsyncTask, так как этот метод работает в потоке пользовательского интерфейса. Вам необходимо сделать всю сетевую активность в doInBackground.

+0

Интересно! Я думаю, это может помочь мне решить http://stackoverflow.com/questions/6622101/networkonmainthread-exception-while-executing-httprequest-in-a-bound-service-fro/10037830#10037830 – Shine

+0

Это решило проблему, но у меня есть другой теперь: он возвращает false (т. е. адрес недоступен, и когда я запускаю тот же код 'InetAddress address1 = InetAddress.getByName (" 130.237.161.23 "); boolean reachable = address1.isReachable (4456); 'результат верен. В манифесте у меня есть '' Что может быть причиной? – RegedUser00x

+0

@ RegedUser00x - Я не понимаю - что возвращает ложь и что возвращается? Это похоже на тот же код. Возможно, вам стоит начать отдельный вопрос, показывающий соответствующий код. –

0

Ваш класс onPostExecute() класса Messager выполняется в основном потоке. Вы также выполняете сетевое IO с

InetAddress.getByName ("130.237.161.23");