使用ExecutorService时活动滞后

时间:2016-03-14 09:39:06

标签: java android

我正在使用多个线程和ExecutorService来检查它们何时完成。问题是当我调用init Executor服务并执行线程的方法时(我在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();}

    }

}

请帮忙。感谢。

1 个答案:

答案 0 :(得分:1)

最好使用AsyncTask,这样您就不会在等待所有任务完成时阻止UI线程。因为它已经有一个在UI线程上执行的回调方法,所以它简化了一些事情。确保使用AsyncTask.executeOnExecutor()方法,以便并行执行任务。

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