Выполнение сети в Android из AsyncTask дает NetworkOnMainThreadException

Я пытаюсь написать простое приложение для чата для Android, поэтому у меня есть сервер чата, и я пытаюсь к нему подключиться. Итак, в основном классе у меня есть

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, а не в основном потоке?


person RegedUser00x    schedule 13.05.2012    source источник
comment
onPostExecute выполняется в основном потоке...   -  person Selvin    schedule 14.05.2012


Ответы (2)


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

person Ted Hopp    schedule 13.05.2012
comment
Интересно! Я думаю, это могло бы помочь мне решить stackoverflow.com/questions/6622101/ - person Shine; 14.05.2012
comment
Это решило проблему, но теперь у меня есть еще одна: она возвращает false (т.е.) адрес недоступен, и когда я запускаю тот же код InetAddress address1 = InetAddress.getByName("130.237.161.23"); boolean reachable = address1.isReachable(4456);, результат верен. В манифесте у меня <uses-permission android:name="android.permission.INTERNET" /> В чем может быть причина? - person RegedUser00x; 14.05.2012
comment
@RegedUser00x - я не понимаю, что возвращает false, а что возвращает true? Похоже, тот же код. Возможно, вам следует начать отдельный вопрос, показывающий соответствующий код. - person Ted Hopp; 14.05.2012
comment
Вот это stackoverflow.com/questions/10575747/ - person RegedUser00x; 14.05.2012

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

InetAddress.getByName("130.237.161.23");

person D-Dᴙum    schedule 13.05.2012