Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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
android thread.join()未按预期工作_Android_Multithreading_Android Studio_Android Volley - Fatal编程技术网

android thread.join()未按预期工作

android thread.join()未按预期工作,android,multithreading,android-studio,android-volley,Android,Multithreading,Android Studio,Android Volley,我试图实现以下目标:在后台线程中使用Volley的Futures执行一个同步http请求,并让当前线程等待后台线程完成,以便它稍后可以处理http响应 实际发生的情况是,在.join()之后,一切似乎都挂起了,我从未在runnable的run方法中输入断点,也没有在join()之后执行任何命令 注意-当前线程是一个活动类,此特定函数属于Java类,其服务由活动调用。我知道UI线程上的.join()会导致它挂起…但只有在后台线程完成后才会挂起,对吗?当我使用.wait()而不是.join()时,后

我试图实现以下目标:在后台线程中使用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
}
private String requestConversionRatesFromApi()抛出InterruptedException
{
最终JSONObject[]localResponse={null};
Runnable Runnable=新的Runnable()
{
@凌驾
公开募捐
{
字符串url=“myurl”;
RequestQueue=Volley.newRequestQueue(_上下文);
RequestFuture=RequestFuture.newFuture();
JsonObjectRequest=newJSONObjectRequest(url,new JSONObject(),future,future);
添加(请求);
试一试{
JSONObject JSONObject=future.get();
localResponse[0]=jsonObject;//也不会到达这里,除非我使用.wait(),然后它发生得非常快
}捕捉(中断异常e){
e、 printStackTrace();
}捕获(执行例外){
e、 printStackTrace();
}
}
};
螺纹t=新螺纹(可运行);
t、 start();
t、 join();
返回“foo”;//未到达此处
}

您应该在logcat的输出中有一个错误,您不能在主(UI)线程(活动、片段等)上发出网络请求。让一个线程启动一个新线程,然后除了等待新线程完成之外什么都不做有什么意义?为什么不直接在第一个线程中完成工作?@crgarridos我将检查是否有错误并进行更新。然而,我真的在主线程上发出网络请求吗?我认为我的主线程创建了一个新线程,“t”,而“t”是执行请求的线程,而不是主线程。@jameslarge关键是crgarridos说的,我不能在主线程上执行网络请求,所以我创建了一个新线程。我承认,我不懂安卓,但这个建议没有任何意义。Java进程中的任何线程都可以做任何其他线程能够做的事情。我敢打赌,如果有人告诉你“主”线程“不能”进行网络I/O,他们真正的意思是,主线程不应该等待网络I/O。你的代码让主线程等待。它正在等待其他线程执行I/O的事实没有帮助。等待是不好的,或者。。。无论如何,这是我的猜测。就像我说的,我不是Android程序员。