0

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ソケットと4つの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にあるのはなぜですか?

4

2 に答える 2

1

そのメソッドはUIスレッドで実行されるため、onPostExecuteのネットワークI/Oを実行することはできません。AsyncTaskですべてのネットワークアクティビティを実行する必要がありますdoInBackground

于 2012-05-13T21:10:47.127 に答える
0

Messager クラスの onPostExecute() はメイン スレッドで実行されます。また、ネットワークIOを実行しています

InetAddress.getByName("130.237.161.23");

于 2012-05-13T21:17:50.737 に答える