android thread.join () не работает должным образом - PullRequest
0 голосов
/ 24 июня 2018

Я пытаюсь добиться следующего: выполнить один синхронный http-запрос, используя Volley's Futures в фоновом потоке, и попросить текущий поток дождаться завершения фонового потока, чтобы впоследствии он мог обработать ответ http.

Что действительно происходит, так это то, что после .join () все кажется зависшим, и я никогда не вхожу в точки останова внутри метода runnable или не запускаю ни одну из команд после join ().

ПРИМЕЧАНИЕ- текущий поток является классом активности, и эта конкретная функция относится к классу Java, сервисы которого вызываются этим действием.Я знаю, что .join () в потоке пользовательского интерфейса вызывает его зависание ... но только до тех пор, пока не завершится фоновый поток, верно?Что ж, когда я использую .wait () вместо .join (), фоновый поток завершается очень быстро.Как будто вызов join не позволяет фоновому потоку выполнять свою работу.

private String requestConversionRatesFromApi() throws InterruptedException
{
    final JSONObject[] localResponse = {null};
    Runnable runnable = new Runnable()
    {
        @Override
        public void run()
        {
            String url = "myurl";
            RequestQueue queue = Volley.newRequestQueue(_context);
            RequestFuture<JSONObject> future = RequestFuture.newFuture();
            JsonObjectRequest request = new JsonObjectRequest(url, new JSONObject(), future, future);
            queue.add(request);

            try {
                JSONObject jsonObject = future.get();
                localResponse[0] = jsonObject; //doesn't get here either unless I'm using .wait() and then it happens really fast
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (ExecutionException e) {
                e.printStackTrace();
            }
        }
    };
    Thread t = new Thread(runnable);
    t.start();
    t.join();
    return "foo"; //Doesn't get here
}
...