2011-11-30 75 views
1

我有一堆行動,需要在一個確切的等待期後在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++; 
    } 
} 

回答

0

你的選項1比你的備選方案二,因爲你不是無謂地攪動儘可能多的CPU時間,你可以得到運行它顯著更好。

+0

是的當然,但在真正的應用程序中,我使用了大約600個操作(600個Runnable對象),這些操作使OutOfMemoryException崩潰。時機似乎也沒有關係。 – SimonSays

+0

如果你沒有內存來安排你的工作量,你的系統的工作負載可能會有點貴!然而,第二種方法可以通過簡單的加法實現更好的效果:在循環結束時,在剩下的時間內調用Thread.sleep()直到下一次有興趣做某件事。 – mah

+0

對,這是個不錯的主意。謝謝! – SimonSays

0

既然你是在一個循環中創建可運行的對象,我想他們都會做同樣的事情?如果是這樣的話,爲什麼不在循環外創建一個runnable,然後在schedule方法中重用它?