Java 仅当方法完成时才继续
我用Java为Windows制作了一个服务器和一个客户端,一切都很好。我必须做一个Android客户端,但我在实现上有一些困难。 首先,我不想使用AsyncTask,因为它已被弃用,所以我在Internet上发现我可以使用带有可运行接口的线程。 在我的活动中,我有这个代码Java 仅当方法完成时才继续,java,android,multithreading,runnable,Java,Android,Multithreading,Runnable,我用Java为Windows制作了一个服务器和一个客户端,一切都很好。我必须做一个Android客户端,但我在实现上有一些困难。 首先,我不想使用AsyncTask,因为它已被弃用,所以我在Internet上发现我可以使用带有可运行接口的线程。 在我的活动中,我有这个代码 if (!Client.getInstance().isConnected()) { Client.getInstance().connect(); } if (Client.getInstance().isConn
if (!Client.getInstance().isConnected()) {
Client.getInstance().connect();
}
if (Client.getInstance().isConnected()) {
// Staff to do if the socket is connected
} else {
ConnectionUtils.serverUnreachable(this);
}
我创建了客户机类,它是一个单例。在这段代码中,当它运行connect()
code时,客户端不会等待方法完成,因此它会运行serverUnreachable方法(一个AlertDialog,通知您与服务器的连接未成功(但服务器告诉我客户端已连接)
连接发生了,但是在if语句中,程序不会等到
Client.getIntsance().connect()
方法结束。当调用thread.start()
时,您正在启动一个新线程,并执行传递给它的Runnable,但这并不意味着主(UI)线程您之前所在的线程在那里等待
它立即继续执行下一个指令,在您的情况下,该指令正在检查connected
标志,大多数情况下该标志是“太早”,因此在其他线程将其设置为true之前,它将为false
您的案例的解决方案是在线程完成后运行该代码。如果需要在主线程上运行该代码(以便与视图交互),则可以使用方法
下面是一个例子:
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;
}
runAfterConnection();
}
});
thread.start();
}
public void runAfterConnection(){
runOnUiThread(new Runnable() {
@Override
public void run() {
if(Client.getInstance().isConnected()) {
// Staff to do if the socket is connected
} else {
ConnectionUtils.serverUnreachable(this);
}
}
});
}
我有Client类(connect()方法所在的地方)和Activity类(有UI的地方)…如果我有两个不同的类中的方法,如何运行此代码?向connect方法添加回调。
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;
}
runAfterConnection();
}
});
thread.start();
}
public void runAfterConnection(){
runOnUiThread(new Runnable() {
@Override
public void run() {
if(Client.getInstance().isConnected()) {
// Staff to do if the socket is connected
} else {
ConnectionUtils.serverUnreachable(this);
}
}
});
}