마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

AsyncTask 질문입니다.

0 추천
제가 지금 구글맵 API를 사용하는데,

파일을 로드해서 화면에 뿌리는 작업을 AsyncTask로 돌렸습니다.

파일 로드 부분을 doInBackground에 넣었구요.

요안에서 for문을 돌리고 for문안에서

 데이터를 가지고 publishProgress 를 호출하고

onProgressUpdate 에서 화면에 마커를 찍습니다.

그런데 문제는 속도가 너무 빨라서

onProgressUpdate 한번 돌기 전에 doInBackground 안의 for문이 다시 publishProgress를 호출하는 것 같아요.

실행순서가

doInBackground for문 내부에서 publishProgress호출-> onProgressUpdate 수행 -> onProgressUpdate 완료 -> doInBackground에서 publishProgress호출

이렇게 돌아가야 되는데

doInBackground for문 내부에서 publishProgress호출 -> onProgressUpdate 수행 -> doInBackground에서 publishProgress호출 -> onProgressUpdate 완료

이렇게 되는것 같아요.

테스트는..

doInBackground에서 publishProgress 바로 아래 부분에 Thread.sleep(30)을 넣어주니 데이터가 정상적으로 다 나오네요.

대신 속도가 엄청 느려지죠..

30 대신 20이나 10을 넣으면 부분 부분 데이터가 겹치구요.

글이 좀 긴데요..

제가 궁금한 것은 for문 안에서

onProgressUpdate가 다 끝날 때까지 기다렸다가 publishProgress를 호출 하는법을 모르겠어요.

뭔가 있을거 같긴 한데... 조언좀 부탁드립니다.
시험모드 (970 포인트) 님이 2013년 3월 22일 질문

1개의 답변

0 추천
publishProgress 는  background에서 수행되고 onProgressUpdate는 main thread에서 실행되니 (handler에 sendMessage) 당연한 결과입니다. 애초에 onProgressUpdate 가 수행되기전에 그 다음 for문을 돌아도 문제가 없도록 프로그램을 만드셔야 합니다. (UI에서 반영되어야할 데이터를 parameter로 넘기는 방식)

doInBackground에서 사용하는 변수를 그대로 onProgressUpdate에서도 접근하시면 서로 다른 thread에서 접근하도록 만드는거라 thread safe하지 않습니다. 그래도 정 onProgressUpdate 후에 다음 for문이 돌기를 원하신다면 shared object를 하나 만들고 wait, notify를 사용하시면 되겠습니다만 비추합니다.
로쓰 (680 포인트) 님이 2013년 3월 22일 답변
...