在循环中调用异步任务?

时间:2014-04-16 12:39:26

标签: android android-asynctask

我想在循环中调用异步任务并且并行执行几次。

我有一个项目列表,我将其拆分为较小的列表,每个列表中包含10个项目。 然后,对于每个小型List,我使用THREAD_POOL_EXECUTOR执行异步任务。

问题是,它不起作用。我正在思考它,因为每次传递给AsyncTask时我都使用相同的列表 - 我认为它可以作为参考传递。

我是否需要以某种方式动态创建新列表?

   //split the ListItems into 10s
        if (actualThumbs.size() > 10){

        List<List<ListItem>> parts = chopped(actualThumbs, 10); // this splits it into parts of 10
        List< ListItem > listToSend  = new ArrayList<ListItem>(); //this is the list to pass
    for(int i = 0; i < parts.size(); i++){ //for every part


        for(int x = 0; x < parts.get(i).size(); x++){ //for everything in that part
            //add to its own List
            listToSend.add(parts.get(i).get(x));

        }
        //this is the async task
        loadActualThumbs thumbs = new loadActualThumbs();
        //execute multiple threads
        thumbs.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,listToSend );
        listToSend.clear(); //clearing the list ready for a new one - PROBLEM?
     }
    }
    else
    {
        //else just execute AsyncTask normally, this works OK
        loadActualThumbs thumbs = new loadActualThumbs();
        thumbs.execute(actualThumbs);
    }

修改
我尝试更改我的代码,而是将我要发送到Async任务的每个List添加到另一个List,然后遍历该列表列表并发送每个列表:

 if (actualThumbs.size() > 10){

                List<List<ListItem>> parts = chopped(actualThumbs, 10);
                List< ListItem > listToSend  = new ArrayList<ListItem>();
                List<List<ListItem>> sendMe = new ArrayList<List<ListItem>>();
            for(int i = 0; i < parts.size(); i++){ //for every part


                for(int x = 0; x < parts.get(i).size(); x++){ //for everything in that part
                    //add to its own ListItem?
                    listToSend.add(parts.get(i).get(x));

                }

                sendMe.add(listToSend);// add the List to this List
                listToSend.clear();
             }

                for(int e = 0; e<sendMe.size();e++){ //loop through the list of lists

                    loadActualThumbs thumbs = new loadActualThumbs();
                    //execute multiple threads?
                    thumbs.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,sendMe.get(e) ); // execute async with correct List
                }

            }

            else
            {
                if (actualThumbs.size() > 0){
                //load actual thumbnails
                loadActualThumbs thumbs = new loadActualThumbs();
                thumbs.execute(actualThumbs);
                }

            }

2 个答案:

答案 0 :(得分:0)

如果你需要在特定的时间间隔内执行asynctask,那么你可以使用Timer来实现相同的..

喜欢这个..

Timer timer = new Timer();
    TimerTask doAsynchronousTask = new TimerTask() {
        @Override
        public void run() {
            try {
                System.out
                        .println("=================== I am in pooling state ===============");
                GetBookingStatusAsyncTask performBackgroundTask = new GetBookingStatusAsyncTask();
                performBackgroundTask.execute();

            } catch (Exception e) {
                e.printStackTrace();
            }

        }
    };

现在你需要杀死这个计时器..

timer.cancel();
timer = null;

还可以使用布尔检查以便无限循环...即如果为true则执行AsyncTask ..如果为false则停止AsyncTask ..就像..

public void callAsynchronousTask(boolean b) {

        // timer.cancel();
        if (b) {

            System.out.println("============= Check for timer check " + tcheck);
            // execute in every 10000 ms
            tcheck++;

        } else {
            System.out
                    .println("============= Check for timer check + cancelling timer task "
                            + tcheck);

            timer.cancel();
            timer = null;
            System.out.println("=============timer is ===" + timer);
            // finish();
            return;
        }

    }

当你需要关闭这个任务时,只需要传递真/假条件就好..你需要在AsyncTask中传递它。

callAsynchronousTask(true); / callAsynchronousTask(false);

希望它有所帮助!..

答案 1 :(得分:0)

您的代码现在应该如下所示:

List<List<ListItem>> parts = chopped(actualThumbs, 10);
for(List<ListItem> list : parts) {

    new loadActualThumbs().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, list);

}

我实际上不确定线程​​池的大小是什么,或者它是否是一个缓存的线程池,但您可以使用Executors.newCachedThreadPool()和Executors.newFixedThreadPool(int count)创建自己的线程池......但是我和#39; d只需使用AsyncTask.THREAD_POOL_EXECUTOR ....应该工作:)