0

2つのクラスを作成しました。最初のクラスは、クライアントからのソケット接続を待機して受け入れるスレッドを実行するサーバークラスです。

2番目のクラスは、ソケット接続によって渡されたテキストメッセージを取得する新しいスレッドを開始するEchoThreadクラスです。これは、一度に複数のクライアントをサーバーに接続できるようにするために、これを行う必要があるためです。そこで、このクラスを作成しました。サーバークラスのwhile(true)ループで呼び出され、接続が確立されたときに新しいスレッドを開始します。

問題は、このアプリのlogcatがEchoThreadクラスのnullPointer例外であるということです。次の行にあります。

  handler.post(new Runnable() {

このエラーメッセージが表示されるのはなぜですか?

サーバークラス:

  public class ServerThread implements Runnable {

    public void run() {
        try {
            if (SERVERIP != null) {
                handler.post(new Runnable() {
                    @Override
                    public void run() {
                        serverStatus = "Listening on IP: " + SERVERIP;
                    }
                });
                serverSocket = new ServerSocket(SERVERPORT);
                while (true) {
                    // listen for incoming clients
                    Socket client = serverSocket.accept();
                    handler.post(new Runnable() {
                        @Override
                        public void run() {
                            Intent intent = new Intent();
                            intent.setAction("com.example.diceRolled");
                            intent.putExtra("serverStatus","Connected");
                            sendBroadcast(intent);
                        }
                    });

                    new EchoThread(Server.this, client).start();

                } // end while(true) method  

            } else {  // the rest of the code for Server class....

EchoThreadクラス:

 public class EchoThread extends Thread {
        protected Socket socket;
        private String line;
        private Handler handler;
        private Context context;
        private Socket client;

      public EchoThread(Context c, Socket clientSocket) {
                        this.socket = clientSocket;
                        this.context = c;
      }

      public void run(){
      try {
          BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));

          while ((line = in.readLine()) != null) {
          //    Log.d("ServerActivity", line);
              handler.post(new Runnable() {
                  private String receivedCommand;

                @Override
              public void run() {
              receivedCommand = line;

              Intent intent = new Intent();
                intent.setAction("com.example.diceRolled");
                intent.putExtra("serverStatus", line.trim());
                context.sendBroadcast(intent);


  Toast.makeText(context, "sent message " + receivedCommand, Toast.LENGTH_SHORT).show();

  // the rest of the code for EchoThread class....
4

1 に答える 1

0

nullクラス変数として作成するため、ハンドラーは残ります

private Handler handler;

しかし、実際に保持するものを与えることは決してありません。

あなたが出くわしたとき

handler.post()

NPEがスローされます。

したがって、インスタンス化するhandlerか、保持するためにnull以外の参照を指定する必要があります。

ハンドラーとルーパーに関する詳細情報が必要な場合は、これこれが価値がある可能性があります(このSOの回答と同じリンク。

于 2013-02-05T04:15:48.887 に答える