java - Android/Java实现Runnable进入死循环

标签 java android multithreading android-intent

我使用以下代码连接两个 Android 设备 P2P。问题是,当服务器从客户端接收数据时,其 Thread/Runnable 不会停止。

请建议我一种方法来停止/强制其进入无限循环。

以下是我用于服务器 Activity 的代码:

       public class ServerThread implements Runnable {
            private volatile boolean keepGoing = true;

               public void requestStop() {
                   keepGoing = false;
                }
               public void run() {
                   try {
                       if (SERVERIP != null) {
                           handler.post(new Runnable() {
                               @Override
                               public void run() {
                      serverStatus.setText("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() {
                            serverStatus.setText("Connected.");
                        }
                    });

                    try {
                        BufferedReader in = new BufferedReader(new            
                             InputStreamReader(client.getInputStream()));
                        line = null;
                        while ((line = in.readLine()) != null) {
                            Log.d("ServerActivity", line);
                            handler.post(new Runnable() {
                                @Override
                                public void run() {

                                    serverStatus.setText(line);


                                    Log.d("IP recevied", line);
                                    requestStop();
                                    //finish();

                                    //Intent i = new Intent(ServerActivity.this, 
                                        //ClientActivity.class);
                                    //startActivity(i);
                                    //serverStatus.setText(line);
                                    // do whatever you want to the front end
                                    // this is where you can be creative
                                }
                            });
                        }

                        break;
                    } catch (Exception e) {
                        handler.post(new Runnable() {
                            @Override
                            public void run() {
                                serverStatus.setText("Oops. Connection interrupted. 
                                        Please reconnect your phones.");
                            }
                        });
                        e.printStackTrace();
                    }
                }
            } else {
                handler.post(new Runnable() {
                    @Override
                    public void run() {
                        serverStatus.setText("Couldn't detect internet connection.");
                    }
                });
                       }
                              } catch (Exception e) {
                                  handler.post(new Runnable() {
                                     @Override
                           public void run() {
                    serverStatus.setText("Error");
                           }
                       });
                       e.printStackTrace();
                   }
               }
           }

编辑:

   while (keepGoing) {
         // listen for incoming clients
         Socket client = serverSocket.accept();
         handler.post(new Runnable() {
             @Override
             public void run() {
                 serverStatus.setText("Connected.");
             }
         });

         try {
             BufferedReader in = new BufferedReader(new            
                  InputStreamReader(client.getInputStream()));
             line = null;
             while (((line = in.readLine()) != null) && keepGoing) {
                 Log.d("ServerActivity", line);
                 handler.post(new Runnable() {
                     @Override
                     public void run() {

                         serverStatus.setText(line);


                         Log.d("IP recevied", line);
                         requestStop();
                         //finish();

                         //Intent i = new Intent(ServerActivity.this, 
                             //ClientActivity.class);
                         //startActivity(i);
                         //serverStatus.setText(line);
                         // do whatever you want to the front end
                         // this is where you can be creative
                     }
                 });
             }

最佳答案

我认为问题在于,即使您向服务器发出停止信号,它仍然停留在对 serverSocket.accept(); 的调用中,等待其他客户端连接。您还应该做的是在 stop 方法中关闭套接字:

public void requestStop() {
      keepGoing = false;
      serverSocket.close();
}

强制代码抛出 IOException,然后重新检查 while 条件并退出。

关于java - Android/Java实现Runnable进入死循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12550596/

相关文章:

android - android 连续获取当前时间

java - 使用 Java 和 HTML 获取两个字符串输入之和的正确方法是什么?

java - 使用 InternetAddress.validate() 检查电子邮件地址

java - 为什么mybatis更新和删除不起作用?

android - 使用 Twitter 请求电子邮件

Java线程加入for循环,输出中的未知行为

java - 用于模拟的可编程 JDBC 驱动程序

java - OkHttp javax.net.ssl.SSLPeerUnverifiedException : Hostname domain. com 未验证

android - 视频完成时从 surfaceview 清除视频帧

java - 使用复选框在文本区域包装文本