执行动作的时间轴

问题描述:

我有一堆行动,需要在一个确切的等待期后在Android应用程序中执行。执行动作的时间轴

动作1:启动后1000ms的
动作2:开始后2000毫秒
动作3:启动后3000ms

我开发2种不同的方法来实现这一点。一个带有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++; 
    } 
} 

你的选项1比你的备选方案二,因为你不是无谓地搅动尽可能多的CPU时间,你可以得到运行它显著更好。

+0

是的当然,但在真正的应用程序中,我使用了大约600个操作(600个Runnable对象),这些操作使OutOfMemoryException崩溃。时机似乎也没有关系。 – SimonSays

+0

如果你没有内存来安排你的工作量,你的系统的工作负载可能会有点贵!然而,第二种方法可以通过简单的加法实现更好的效果:在循环结束时,在剩下的时间内调用Thread.sleep()直到下一次有兴趣做某件事。 – mah

+0

对,这是个不错的主意。谢谢! – SimonSays

既然你是在一个循环中创建可运行的对象,我想他们都会做同样的事情?如果是这样的话,为什么不在循环外创建一个runnable,然后在schedule方法中重用它?