Как остановить текущий поток, пока другой поток не завершит его выполнение? - PullRequest
1 голос
/ 17 марта 2012

Вот моя проблема ...

 public static String response = "";   

 public static String sendDataToServer(String data)
  {
    new Thread()  
    {
     public void run()
     {
     //sending data to server
     response = httpClient.execute(httppost, new BasicResponseHandler()).trim();
    }

    } .start();   

   return response;

  }

Когда я вызываю этот метод, я получаю пустую строку в качестве ответа.

String res = sendDataToServer("my_data");  //res is always empty string
 //...XXXXXXX code after calling the method 

И всегда код XXXXX выполняется перед завершением выполнения метода sendDataToServer (). Почему res всегда пуст? Как я могу получить правильную строку ответа? Как я могу остановить выполнение кода XXXX перед выполнением метода sendDataServer ()? Благодаря.

Ответы [ 3 ]

5 голосов
/ 17 марта 2012

Вы можете сделать:

Thread t = new Thread() {
    public void run() {
        //sending data to server
        response =
              httpClient.execute(httppost, new BasicResponseHandler()).trim();
    }
 };
 t.start();
 t.join();

таким образом, вы будете ждать окончания потока, а затем продолжите.

Однако имейте в виду, что ожидание завершения потока опасноAndroid, особенно в потоке пользовательского интерфейса (это основной поток).Тем не менее, я предполагаю, что этот поток не в потоке пользовательского интерфейса, потому что в противном случае AsyncTask было бы лучшим решением (и более нативным).

1 голос
/ 17 марта 2012

вы можете использовать CountDownLatch для синхронизации выполнения потока.Как указано в документе, CountDownLatch позволяет одному или нескольким потокам ожидать завершения набора операций, выполняемых в других потоках.Если поток, начинающий sendDataToServer, является пользовательским интерфейсом или основным потоком, конечно, это приведет к проблеме с отзывом ваших приложений.Дайте больше деталей.

1 голос
/ 17 марта 2012

Вы можете использовать join () для ожидания потока, но поскольку ваш поток, то же самое делает следующее:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...