Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/226.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 使用ExecutorService时的活动延迟_Java_Android - Fatal编程技术网

Java 使用ExecutorService时的活动延迟

Java 使用ExecutorService时的活动延迟,java,android,Java,Android,我正在使用多个线程和ExecutorService来检查它们何时全部完成。问题是当我调用init Executor service和Executor threads的方法(我在onCreate()中调用它)时,我在活动启动时有延迟。这是我的密码: public void test(){ ExecutorService executor = Executors.newCachedThreadPool(); executor.execute(new SomeTask());

我正在使用多个线程和ExecutorService来检查它们何时全部完成。问题是当我调用init Executor service和Executor threads的方法(我在onCreate()中调用它)时,我在活动启动时有延迟。这是我的密码:

public void test(){
    ExecutorService executor = Executors.newCachedThreadPool();
    executor.execute(new SomeTask());
    executor.execute(new SomeTask());
    executor.execute(new SomeTask());
    executor.shutdown();

    try{
        boolean finshed = executor.awaitTermination(1, TimeUnit.MINUTES);
    }
    catch (InterruptedException e){e.printStackTrace();}
    if (executor.isTerminated()){
        Toast.makeText(AddVehicleActivity.this,"DONE",Toast.LENGTH_LONG).show();
    }

}


 private class SomeTask implements Runnable
{
        @Override
        public void run(){
            final Request request = new Request.Builder()
                    .addHeader("Authorization",SharedPreferencesHelper.getToken())
                    .url("http://sapron.uveee.ru/api/vehicles/marks/get")
                    .build();
        try{
            Response response = client.newCall(request).execute();
            if (!response.isSuccessful()) {
                throw new IOException("Unexpected code " + response);
            }else{
                Gson gson = new GsonBuilder().create();
                MarkResponse resp = gson.fromJson(response.body().charStream(), MarkResponse.class);

                for (int i = 0;i<resp.getData().size();i++){
                    Log.i("SHOWVEH", "onResponse: " + resp.getData().get(i).getImg());
                }
            }
            }catch (IOException e){
            e.printStackTrace();}

    }

}
公共无效测试(){
ExecutorService executor=Executors.newCachedThreadPool();
executor.execute(newsometask());
executor.execute(newsometask());
executor.execute(newsometask());
executor.shutdown();
试一试{
布尔finshed=执行器等待终止(1,时间单位为分钟);
}
catch(InterruptedException e){e.printStackTrace();}
if(executor.isTerminated()){
Toast.makeText(AddVehicleActivity.this,“DONE”,Toast.LENGTH_LONG.show();
}
}
私有类SomeTask实现可运行
{
@凌驾
公开募捐{
最终请求=新请求.Builder()
.addHeader(“授权”,SharedReferencesHelper.getToken())
.url(“http://sapron.uveee.ru/api/vehicles/marks/get")
.build();
试一试{
Response=client.newCall(request.execute();
如果(!response.issusccessful()){
抛出新IOException(“意外代码”+响应);
}否则{
Gson Gson=new GsonBuilder().create();
MarkResponse resp=gson.fromJson(response.body().charStream(),MarkResponse.class);

对于(int i=0;i而言,最好使用
AsyncTask
,这样在等待所有任务完成时就不会阻塞UI线程。因为它已经有一个回调方法在UI线程上执行,这会简化一些事情。请确保使用该方法,以便并行执行任务


每个任务完成后,您可以在
onPostExecute()
中增加一个
int
变量。一旦该变量等于您需要完成的任务数量,您将知道所有任务都已完成,您可以相应地更新活动中的UI。

您是否在
onCreate()中调用上述
test()
方法
activity的方法?如果是这样,并且您正在UI线程上调用它,那么您将阻止它60秒,因为调用了
executor.waittermination(1,TimeUnit.MINUTES);
test()中的
。这可能是延迟的原因。@GeorgeMulligan那么我应该在哪里调用它呢?@GeorgeMulligan认为我可以在任何我想要的地方调用线程,因为它们不在UI线程中运行。执行可运行程序的调用很好。这是对
的调用等待终止(…)
这并不是因为该调用阻止了从中进行调用的任何线程。您可以尝试将其删除,您应该注意到该活动不再延迟。@GeorgeMulligan感谢它的帮助。但是我如何知道所有线程都已完成?