我正在尝试实现以下目标:在后台线程中使用Volley的Futures执行单个同步http请求,并让当前线程等待后台线程完成,以便以后可以处理http响应。
实际上发生的是,在.join()之后,一切似乎都死机了,我从没有在runnable的run方法内输入断点,也从未在join()之后进入任何命令。
注意-当前线程是活动类,并且此特定功能是Java类的,该类的服务由活动调用。我知道UI线程上的.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
}