我有一堆操作需要在确切的等待期后在Android应用程序中执行。
动作1:1000ms后启动
行动2:2000ms后开始
行动3:在3000ms之后开始
我开发了两种不同的方法来实现这一目标。一个带有ScheduledThreadPoolExecutor,另一个带有循环。如果执行的动作太多而且感觉也不那么精确,则ScheduledThreadPoolExecutor会导致OutOfMemoryException。带循环的版本实际上非常好并且感觉很精确,但当然使用了大量的CPU能力。
有没有人有类似任务的经验,可以给我一个暗示最好的方法是什么?
哦,这当然会在AsyncTask中运行。
THX 西蒙
int[] times = new int[]{ 1000, 2000, 3000 };
// 1. use ScheduledThreadPoolExecutor
ScheduledThreadPoolExecutor ex = new ScheduledThreadPoolExecutor(times.length);
for(int i = 0; i < times.length; i++){
ex.schedule(new Runnable() {
@Override
public void run() {
System.out.println("timer");
}
}, times[i], TimeUnit.MILLISECONDS);
}
// 2. use loop
int i = 0;
int max = times.length;
long start = System.currentTimeMillis();
while(i < max){
int t = times[i];
long diff = System.currentTimeMillis() - start;
if(diff >= t){
System.out.println("loop");
i++;
}
}
答案 0 :(得分:0)
您的选项1明显优于您的选项2,因为您不必为运行它而浪费尽可能多的CPU时间。
答案 1 :(得分:0)
由于你是在循环中创建可运行的对象,我猜他们都会做同样的事情?如果是这种情况,为什么不在循环之外创建一个runnable,然后在schedule方法中重用它呢?