java—仅当方法完成时才继续

42fyovps  于 2021-07-11  发布在  Java
关注(0)|答案(1)|浏览(250)

我用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() 方法。

50few1ms

50few1ms1#

当你打电话的时候 thread.start() ,您将启动一个新线程,并执行传递给它的runnable,但这并不意味着您之前所在的主(ui)线程将在那里等待。
它立即继续下一个指令,在你的情况下,这是检查 connected 标志,大多数情况下它是'太早',因此在其他线程将其设置为true之前它将是false。
对于您的案例,解决方案是在线程完成后运行该代码。如果需要在主线程上运行它(以便与视图交互),那么可以使用activity.runonuithread(…)方法。
举个例子:

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);
          }
        }
   });
}

相关问题