2011-11-30 5 views
1

정확한 대기 기간이 지나면 안드로이드 앱에서 실행해야하는 많은 작업이 있습니다.작업의 타임 라인을 실행

동작 1 : 시작 1000MS
작업 후 2 : 이것을 달성하기 위해 2 개 가지 접근법을 개발 3000ms

시작 후 : 2000ms
3 동작 후에 시작한다. 하나는 ScheduledThreadPoolExecutor가 있고 다른 하나는 루프가 있습니다. 실행해야 할 액션이 너무 많고 정확하지 않은 경우 ScheduledThreadPoolExecutor는 OutOfMemoryException을 발생시킵니다. 루프가있는 버전은 실제로 꽤 잘 작동하고 정밀하게 느껴지지만 물론 엄청난 양의 CPU 성능을 사용합니다.

누구나 비슷한 작업 경험이 있으며 가장 좋은 방법은 무엇인지 힌트를 줄 수 있습니까?

오 물론 이것은 AsyncTask에서 실행됩니다.

들으 사이먼

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

그래,하지만 진짜 응용 프로그램에서 나는 OutOfMemoryException으로 응용 프로그램을 충돌시키는 약 600 개의 작업 (600 개의 Runnable 개체)을 사용합니다. 또한 타이밍은 약간 벗어난 것 같지 않습니다. – SimonSays

+0

작업량을 예약 할 메모리가 없다면 시스템에 약간의 작업 부하가 걸릴 수 있습니다! 그러나 두 번째 접근법은 간단한 추가로 더 잘 작동 할 수 있습니다. 루프가 끝날 때 다음에 뭔가 할 때까지 남은 시간 동안 Thread.sleep()을 호출하십시오. – mah

+0

오른쪽, 꽤 좋은 생각입니다. 고마워! – SimonSays

0

루프에서 실행 가능한 개체를 작성하기 때문에 모두 동일한 작업을 수행 할 것입니다. 그렇다면 루프 외부에서만 하나의 실행 파일을 만든 다음 schedule 메서드에서 다시 사용할 수 있습니까?

관련 문제