gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 00:12:14 25 4
gpt4 key购买 nike

我使用以下代码连接两个 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com