我有一堆行動,需要在一個確切的等待期後在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++;
}
}
是的當然,但在真正的應用程序中,我使用了大約600個操作(600個Runnable對象),這些操作使OutOfMemoryException崩潰。時機似乎也沒有關係。 – SimonSays
如果你沒有內存來安排你的工作量,你的系統的工作負載可能會有點貴!然而,第二種方法可以通過簡單的加法實現更好的效果:在循環結束時,在剩下的時間內調用Thread.sleep()直到下一次有興趣做某件事。 – mah
對,這是個不錯的主意。謝謝! – SimonSays