从AsyncTask在Android中进行网络连接会产生NetworkOnMainThreadException

时间:2012-05-13 21:06:27

标签: android android-asynctask android-networking

我正在尝试为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中而不在主线程中?

2 个答案:

答案 0 :(得分:1)

您无法在onPostExecute的{​​{1}}中执行网络I / O,因为该方法在UI线程上运行。您需要在AsyncTask中执行所有网络活动。

答案 1 :(得分:0)

Messager类的onPostExecute()在主线程上完成。您还在使用

进行网络IO
  

InetAddress.getByName(&#34; 130.237.161.23&#34);