我用java为windows制作了一个服务器和一个客户机,一切正常。我必须做一个android客户端,但我有一些困难实现。首先,我不想使用asynctask,因为它已经被弃用了,所以我在internet上发现我可以使用带有runnable接口的线程。在我的活动中,我有这个代码。
if (!Client.getInstance().isConnected()) {
Client.getInstance().connect();
}
if (Client.getInstance().isConnected()) {
// Staff to do if the socket is connected
} else {
ConnectionUtils.serverUnreachable(this);
}
我创建了客户机类,这是一个单例。在这段代码中,当它运行时 connect()
代码时,客户端不会等待方法完成,因此它会运行serverunreachable方法(一个警报对话框,提示您与服务器的连接未成功(但服务器告诉我客户端已连接)。
public void connect() {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
try {
socket = new Socket(ip, port);
out = new ObjectOutputStream(socket.getOutputStream());
in = new ObjectInputStream(socket.getInputStream());
connected = true;
} catch (IOException e) {
e.printStackTrace();
connected = false;
}
}
});
thread.start();
}
连接发生了,但是在if语句中,程序不会等到连接结束 Client.getIntsance().connect()
方法。
1条答案
按热度按时间50few1ms1#
当你打电话的时候
thread.start()
,您将启动一个新线程,并执行传递给它的runnable,但这并不意味着您之前所在的主(ui)线程将在那里等待。它立即继续下一个指令,在你的情况下,这是检查
connected
标志,大多数情况下它是'太早',因此在其他线程将其设置为true之前它将是false。对于您的案例,解决方案是在线程完成后运行该代码。如果需要在主线程上运行它(以便与视图交互),那么可以使用activity.runonuithread(…)方法。
举个例子: