* 과거 안드로이드 개발 중 경험했던 일입니다.
* 당시 답변해 주신 LG전자 연구원분께 감사드립니다.
- 앱에 추가한 기능 (백그라운드에서 통신하는 기능) 이 정상적으로 실행되지 않음
- AsyncTask 가 실행이 안된것도 아니고, 실패 한것도 아님.
- 첫 생성 부분은 정상 호출 되었으니 실행부가 진행되지 않음
- AsyncTask 가 대기 상태로 기다리는 것으로 보임
- 테스트해보니 기존 실행되고 있던 AsyncTask 작업이 끝나니까 이후 대기중이던 AsyncTask 가 정상 실행되는 것을 확인함
* AsyncTask Thread의 제한은 단말의 CPU 개수와 관련이 있습니다.
- AsyncTask Thread 가 정상적으로 싱행되지 않은 기종은 4개의 CPU 가 있는 기종으로,
해당 N-OS (Android 7.0) 기종들은 아래 Android 소스에 의해서 CORE_POOL_SIZE 가 3 이 됩니다.
해당 pool size의 제한으로 앱에서 여러 개 운용중인 AsyncTask 의 동시 사용이 불가했을 것으로 보입니다.
다른 기종으로 시험을 해보니, 6개의 CPU를 가진 기기의 N-OS 에서는 현상이 발생하지 않았습니다.
<M-OS, AysncTask.java>
int CPU_COUNT = Runtime.getRuntime().availableProcessors();
int CORE_POOL_SIZE = CPU_COUNT + 1;
int MAXIMUM_POOL_SIZE = CPU_COUNT * 2 + 1;
<N-OS, AysncTask.java>
int CPU_COUNT = Runtime.getRuntime().availableProcessors();
int CORE_POOL_SIZE = Math.max(2, Math.min(CPU_COUNT - 1, 4));
int MAXIMUM_POOL_SIZE = CPU_COUNT * 2 + 1;
[결론]
- AsyncTask 는 동시 실행 개수에 제한이 있으므로 소켓통신 등의 시간이 오래걸리는 작업은 기본 Runnable Thread 로 구현을 하고
자체적으로 금방 끝나는 백그라운드 작업들만 AsyncTask 로 구현해야 하는것으로 보임
'Programming > Android' 카테고리의 다른 글
Manifest 에 추가하지 않은 Permission 이 표시되어 있는 경우 (0) | 2019.12.13 |
---|---|
[AVD] 에뮬레이터 실행이 안될 때 (0) | 2018.07.07 |