[안드로이드 공부]/동기화

[안드로이드] AsyncTask를 연속으로 사용할 때 문제점

코코모아 2015. 11. 11. 11:16

아래는 코모스튜디오가 직접 만든 무료 앱이에요
(한 번만 봐주세요 ^^)

01

02

03

정각알림 만들기(말하는시계)

말하는 시계 (취침, 자전거) 

말하는 타이머 음성 스톱워치 

asyncTask를 연속으로 사용할 때 어떤 문제점이 발생 할까?


1.   만약, 1개의 비동기 태스크를 사용한다고 가정 하자.

2.   비동기 태스크가 사용자에 의해 계속 호출 된다고 하자.

3.   비동기 태스크는 할 일을 다하고 onPost에서 마지막 할일을 마쳐 준다.

4.   무슨 문제가 있나?


5.   원래 비동기 태스크의 결과는 항상 onPost에서 얻어오기를 희망 한다. 

6.   하지만... 연속으로 비동기태스크를 돌리게 되면 섞이는 경우가 발생한다.

7.   A가 처음 태스크, B를 두 번째 태스크라고 하자.

8.   A가 돌고 있는데  B를 실행 했다. 

9.   A의 onPost가 실행되고 A는 마무리 짓는다. 이것이 정상이다. 하지만

10. B가 실행되면서 A의 onPost 이전에 실행 된다. 즉, 끼어든다.

11. 하지만.. A, B가 모두 마지막에 다른 일을 한다면 상관 없지만.. 같은 결과를 바란다면...

12. B의 onPre 의 작업은 무시되고... A의 마지막 onPost로 태스크는 종료 될 것이다.

13. 왜냐하면, B도  onPost로 마무리 될 것인데 같은 작업이다.


예를 들면

1. onPost 에는 플레이 버튼 이미지를 그린다.

2. onPre에는 포즈 버튼 이미지를 그린다. 

3. 플레이 버튼을 누르면 포즈 이미지로 바뀌면서 플레이를 하고 플레이가 끝나면 버튼은 플레이 이미지로 바뀐다.

4. 그런데...

5. 플레이 중에 볼륨을 조절하면 다시 플레이를 시작하면서 버튼이 포즈 이미지로 바뀌어야 한다.

6. 하지만 B 즉, 두 번째 태스크가(볼륨 조절하면서 시작) 첫 번째 태스크가 치고 들어 온다.

7. 위의 10 번 부터의 일이다.

8. 즉, 두 번째 태스크가 포즈 이미지를 그리고... 끝나면 플레이 이미지를 그려야 하지만,

9. 첫 번째 태스크의 onPost가 두 번째 태스크의 onPre바로 다음에 실행 되면서 포즈 이미지를 그리지 못하게 한다.

10. 그렸지만... 플레이 이미지로 onPost가 덮어 버리는 것이다.

11. 그런 후 두 번째 태스크의 onPost가 또 오면서 플레이 이미지로 덮는다.

12. 즉,... 이런 경우에는 절대 포즈 이미지를 볼 수 없다.


그럼 어떻게?


cancel을 이용 하면 된다.

cancel은 바로 태스크를 멈추지 않지만... 중간에 다른 작업(포즈 이미지 보장)을 할 수 있게 한다.

즉, onCancel()로 들어가서 할일을 한 뒤에 다시 onPost로 가서 일을 마치기 때문에 이전에 실행 된 태스크와 중복되지 않을 수 있다.


        if(mWaitAndDrawTask != null) {

            mWaitAndDrawTask.cancel(true);

            mWaitAndDrawTask = null;

        }


        mWaitAndDrawTask = new WaitAndDrawAsyncTask();


        if (mWaitAndDrawTask != null) {

            mWaitAndDrawTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);

        }


요렇게 호출 하고


@Override

        protected void onCancelled() {

            super.onCancelled();

            Log.v(LOG_TAG + "WaitAndDrawAsyncTask on Cancelled");

            if (mX != null ) {

                mX.setImageResource(R.drawable.pause);

            }

        }


요렇게 하면 포즈 이미지를 보장 받을 수 있다.

하지만, AsyncTask를 절대 남발 하지말자. 관리 불가능에 도달 할 수도 있다.
어려운가... 가려운가.... 모르겠나....그렇나...그렇다... 

아래는 코모스튜디오의 새 앱입니다. 구경 한 번 해주세요 ^^


모든 게시물은 코모스튜디오의 소유이며, 무단 복제 수정은 절대 불가입니다.
퍼가실 경우 댓글과 블로그 주소를 남기고 해당 게시물에 출처를 명확히 밝히세요.