Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/183.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 仅当方法完成时才继续_Java_Android_Multithreading_Runnable - Fatal编程技术网

Java 仅当方法完成时才继续

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

我用Java为Windows制作了一个服务器和一个客户端,一切都很好。我必须做一个Android客户端,但我在实现上有一些困难。 首先,我不想使用AsyncTask,因为它已被弃用,所以我在Internet上发现我可以使用带有可运行接口的线程。 在我的活动中,我有这个代码

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