Android/Java实现Runnable进入无限循环
我使用以下代码连接两个Android设备。问题在于,当服务器从客户端接收数据时,其线程/可运行线程不会停止 请给我建议一种方法来停止/迫使这一过程以无限循环的方式进行 以下是我在服务器活动中使用的一段代码: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
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套接字是不同的-在这里我使用套接字连接以及获取数据通信的输入和输出流-非常感谢澄清+我想提出一个很长的,唯一的半连贯的问题,伙计。