使用ExecutorService时活动出现卡顿

3

我正在使用多线程和ExecutorService来检查它们何时全部完成。问题在于,当我调用方法初始化ExecutorService并执行线程(我在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();}

    }

}

Please help. Thanks.


你是否在Activity的onCreate()方法中调用了上述的test()方法?如果是,并且你是在UI线程上调用它,那么由于test()方法中的executor.awaitTermination(1, TimeUnit.MINUTES);调用,你正在阻塞UI线程60秒钟。这将是延迟的来源。 - George Mulligan
@GeorgeMulligan 那我应该在哪里调用它? - Anton Kazakov
@GeorgeMulligan 我以为可以在任何地方调用线程,因为它们不在UI线程中运行。 - Anton Kazakov
@GeorgeMulligan 谢谢,这很有帮助。但是我怎么知道所有线程都完成了呢? - Anton Kazakov
@GeorgeMulligan 我应该检查 isShutdown 吗? - Anton Kazakov
显示剩余8条评论
1个回答

1
使用AsyncTask会更好,这样您就不会在等待所有任务完成时阻塞UI线程。由于它已经有一个在UI线程上执行的回调方法,因此可以简化一些事情。确保使用AsyncTask.executeOnExecutor()方法以便并行执行任务。
每次任务完成后,您可以在onPostExecute()中增加一个int变量。一旦变量等于您需要完成的任务数,您将知道所有任务已经完成,并且可以相应地在活动中更新UI。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接