我想在循环中调用异步任务并且并行执行几次。
我有一个项目列表,我将其拆分为较小的列表,每个列表中包含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);
}
}
答案 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 ....应该工作:)