정확한 대기 기간이 지나면 안드로이드 앱에서 실행해야하는 많은 작업이 있습니다.작업의 타임 라인을 실행
동작 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++;
}
}
그래,하지만 진짜 응용 프로그램에서 나는 OutOfMemoryException으로 응용 프로그램을 충돌시키는 약 600 개의 작업 (600 개의 Runnable 개체)을 사용합니다. 또한 타이밍은 약간 벗어난 것 같지 않습니다. – SimonSays
작업량을 예약 할 메모리가 없다면 시스템에 약간의 작업 부하가 걸릴 수 있습니다! 그러나 두 번째 접근법은 간단한 추가로 더 잘 작동 할 수 있습니다. 루프가 끝날 때 다음에 뭔가 할 때까지 남은 시간 동안 Thread.sleep()을 호출하십시오. – mah
오른쪽, 꽤 좋은 생각입니다. 고마워! – SimonSays