티스토리 뷰

728x90
반응형

고백합니다.

안드로이드 똥멍청이인 제 자신을.


사연은 이렇습니다.

수백개의 이미지 파일을 다운로드하는 안드로이드 앱을 만드는 중이었습니다.


제가 처음 안드로이드를 공부했을때부터

url connection(RESTful한 호출이나 원격파일 다운로드 등)은 AsyncTask를 통해서

main thread가 아닌 별도의 쓰레드로 실행해야한다는 것을 잘 알고 있었습니다.


당연히 이번에 앱을 만들때도 수백개의 이미지 파일을 다운로드하는데 있어서


new BitmapDownloaderTask().execute(imageUrl);


이런식으로 파라메터로 url을 넣으면 해당 url의 이미지 파일 다운로드하는 태스크를


for 문으로 돌리고 있었죠.


저는 당연히(?) async하다는것을 parallel 하고 simultaneously 하다고 생각했었습니다.

그러니깐 asynctask가 병렬적으로 동시에 한번에 실행된다고 알고 있었죠.


그런데 이상하게도 다운로드하려는 이미지 파일이 크기가 다 다른데


너무나도 순차적으로 이미지 다운로드가 진행되는겁니다.



어라 이거 왜이러지하고 온갖 삽질을 다했는데요.



삽질중에 중요한 안드로이드의 API변화를 발견하게 되었습니다.


When first introduced, AsyncTasks were executed serially on a single background thread. Starting with DONUT, this was changed to a pool of threads allowing multiple tasks to operate in parallel. After HONEYCOMB, it is planned to change this back to a single thread to avoid common application errors caused by parallel execution. If you truly want parallel execution, you can use the executeOnExecutor(Executor, Params...) version of this method with THREAD_POOL_EXECUTOR; however, see commentary there for warnings on its use.


해석하면


AsyncTask가 처음 도입되었을때는 순차적으로 하나의 백그라운드 쓰레드를 실행하였으나, DONUT(1.6버전)부터는 여러개의 태스크를 병렬적으로 처리하도록 변경이 되었고, 다시 HONEYCOMB(3.0버전)부터는 하나의 쓰레드만 실행하게끔 돌아왔다. 그리고 THREAD_POOL_EXECUTOR를 사용한 executeOnExecutor(Executor, Params...) 로 쓰레드를 병렬적으로 실행시킬수 있게 했다고....



이런 API변화를 놓치고 있었다니....



그러니깐 허니콤이상에서는 execute() 명령어로는 순차적으로 하나의 백그라운드 쓰레드를 실행하는 asynctask였던것입니다.


으아아아아아아니!



이런식으로

if (Build.VERSION.SDK_INT>=Build.VERSION_CODES.HONEYCOMB) {
  myTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
} else {
  myTask.execute();
}


병렬적으로 asynctask가 동작하도록 할수 있는것이죠.




관련자료를 더 찾다보니 관련내용을 이렇게 잘 정리해주신 분이 계셨네요.


https://gist.github.com/benelog/5954649


아무쪼록 안드로이드 개발자 여러분 열공하시길 바랍니다.

728x90
반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함