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

asynctask에대해 질문있습니다.

0 추천
AsyncTask클래스를 B라고 칭하겠습니다.

그리고 B안에는 String m이 있다고 가정하겠습니다.

 public class a extends Activity<~~~>{

void oncreate()

{

B.execute(~~~);

Log.i("AAA",B.m)

}

}

위처럼 코드를 작성하였을때 B클래스 내의 onPostExecute()는 위의 oncreate()를 지나 class전체를 빠져나왔을때 실행되는건가요? doInBackground()가 종료되고 실행되는것이 아닌가요?

Log를 찍어보니 doInBackgroudn()까지는 로그가 순조롭게 찍히다가 onPostExecute()에 있는 Log.i 안찍힙니다. 그래서 저 위의 Log.i("AAA",B.m)을 지우고 하니 onPostExecute()에있는 Log.i가 찍히더군요 그래서 딜레이를 주어보고 다 해봤으나 onPostExecute()가 꼭 위의 oncreate()를 포함한 모든 클래스가 종료된후부터 실행이 되더라구요

제가 물어보고싶은것은 onPostExecute() 는 doInBackground()가 끝나고 실행되는건가요 아니면 oncreate()를 포함한 모든 클래스가 종료된후에 실행되는것이 맞나요??
와이번스 (170 포인트) 님이 2015년 10월 14일 질문

1개의 답변

0 추천
우선 AsyncTask에 대한 내용을 읽어보시길 추천합니다. AsyncTask도 실행하는 순서(onPre, doInback, onPost)가 있습니다. 우선 Activity의 라이프 사이클과는 별도로 동작한다고 보시면 됩니다.

간단하게 스레드 1과 스레드2와 서로 연관하는 부분이 없어서, 종료시점을 서로 알지 못하는 경우라고 생각하시면 됩니다. 대체로는 AsyncTask가 Activity의 레퍼런스를 유지하고 있다고 데이터를 Activity로 전송하는 경우가 많아서 Activity가 더 오래 남아있는 객체라고 생각할 수 있지만, 꼭 그렇지만은 않습니다. 그래서 onPostExecute 메서드에서 Activity의 메서드를 호출하는 경우에는 반드시 Activity 변수를 null체크해야 합니다.

Asynctask를 static inner 클래스나 외부 클래스의 경우가 위와 동일하고요..

단순 inner 클래스로 구현한 경우에는 Activity가 AsyncTask의 종료보다는 오래 남아있게 됩니다. 이런 경우 메모리 릭의 현상이 발생하게 됩니다.
mcsong (44,040 포인트) 님이 2015년 10월 14일 답변
...