Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/186.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android/Java实现Runnable进入无限循环_Java_Android_Multithreading_Android Intent - Fatal编程技术网

Android/Java实现Runnable进入无限循环

Android/Java实现Runnable进入无限循环,java,android,multithreading,android-intent,Java,Android,Multithreading,Android Intent,我使用以下代码连接两个Android设备。问题在于,当服务器从客户端接收数据时,其线程/可运行线程不会停止 请给我建议一种方法来停止/迫使这一过程以无限循环的方式进行 以下是我在服务器活动中使用的一段代码: public class ServerThread implements Runnable { private volatile boolean keepGoing = true; public void requestS

我使用以下代码连接两个Android设备。问题在于,当服务器从客户端接收数据时,其线程/可运行线程不会停止

请给我建议一种方法来停止/迫使这一过程以无限循环的方式进行

以下是我在服务器活动中使用的一段代码:

       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();
                   }
               }
           }
编辑:


你为什么评论这句话

  //finish();
一旦建立了连接


既然一旦连接就永远不会结束,那么就有一个无限循环

为什么要评论这行

  //finish();
一旦建立了连接


由于一旦连接就永远不会结束,因此有一个无限循环,我认为问题在于,即使您向服务器发出停止的信号,它仍然卡在对
serverSocket.accept()的调用中,正在等待其他客户端连接。您还应在停止方法中关闭插座:

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

强制代码抛出一个
IOException
,然后在
条件下重新检查
,然后退出。

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

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


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

while(true)
更改为
while(keepGoing)
?将
while(true)
更改为
while(keepGoing)
,没有任何区别。如果我完成活动,线程仍然运行……并显示在日志中,请在完成之前添加行:keepGoing=false,并按照hmjd建议进行更改。它是否显示“IP Received”?您有两个循环-因此您继续接收数据!请确保在IP之后没有发送数据,或者将第二个while((line=in.readLine())!=null)取出,然后启动另一段在该连接例程之外进行通信的代码!仍然有同样的问题,我想我没有明白你的意思。你可以修改代码吗。谢谢,请看我上面的编辑。。。但是您需要在另一个例程中开始管理数据交换!这没什么区别。如果我完成活动,线程仍然运行……并显示在日志中,请在完成之前添加行:keepGoing=false,并按照hmjd建议进行更改。它是否显示“IP Received”?您有两个循环-因此您继续接收数据!请确保在IP之后没有发送数据,或者将第二个while((line=in.readLine())!=null)取出,然后启动另一段在该连接例程之外进行通信的代码!仍然有同样的问题,我想我没有明白你的意思。你可以修改代码吗。谢谢,请看我上面的编辑。。。但是您需要在另一个例程中开始管理数据交换!这是否也会关闭套接字以便与连接的服务器/客户端进行进一步通信?@user387184:服务器套接字不进行任何通信。它只接受客户端连接并创建相应的本地套接字对象(accept的结果)。当然,你以后不能再使用它了,但这就是停止服务器的意义不?这很有趣,因为BT套接字是不同的-在这里我使用套接字连接以及获取数据通信的输入和输出流-非常感谢澄清+我想提出一个很长的,也是唯一一个半连贯的问题,伙计。这不也会关闭套接字以便与连接的服务器/客户端进一步通信吗?@user387184:服务器套接字没有任何通信。它只接受客户端连接并创建相应的本地套接字对象(accept的结果)。当然,你以后不能再使用它了,但这就是停止服务器的意义不?这很有趣,因为BT套接字是不同的-在这里我使用套接字连接以及获取数据通信的输入和输出流-非常感谢澄清+我想提出一个很长的,唯一的半连贯的问题,伙计。