본문 바로가기
개발/안드로이드

AsyncTask 병렬처리

by darksilber 2016. 7. 4.
반응형

출처 - http://nowisgood87.tistory.com/entry/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C%EB%B3%91%EB%A0%AC%EC%B2%98%EB%A6%AC-AsyncTask-%EB%B3%91%EB%A0%AC%EC%B2%98%EB%A6%AC

 

문제발생

- 뷰페이저(ViewPager)에서 좌우로 화면 스크롤 시 이미지 로딩 지연 발생

- 테스트환경의 네트워크가 와이파이(WiFi)다 보니 코드 수정 후 LTE에서의 성능 차이를 뒤늦게 인지


  • 원인발견

- 현재 이미지 다운로드 후 출력하는 기능을 AsyncTask를 이용하여 구현한 상태

- 안드로이드 버전 3.2(허니콤 Honeycomb)부터 AsyncTask.SerialExecutor에 의한 직렬 처리

→ 하나의 작업이 끝나야 다음 작업이 실행


  • 해결방법

- AsyncTask가 병렬처리 되도록 변경

- .execute() 대신 .executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR)를 사용


  • 참고소스

- 프래그먼트의 onStart()

1
2
3
4
5
6
@Override
public void onStart() {
    super.onStart();
    // 이미지 다운로드 실행
    new ImageDownloadTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
}

- AsyncTask의 onPostExecute() 

1
2
3
4
5
6
7
8
class ImageDownloaderTask extends AsyncTask {
        @Override
        protected void onPostExecute(Void result) {
            // 해당 프레그먼트에 존재하는 유일한 값을 로그출력 해보면
            // 병렬처리되어 다운로드되고 있음을 확인 할 수 있다.
            super.onPostExecute(result);
        }
}

     ※ extends AsyncTask<Void, Void, Void>인데, SyntaxHighlighter에 버그가 있어서 생략함

반응형

댓글