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

AsyncTask와 메모리릭 관련 질문드립니다

0 추천
안녕하세요. 질문이 좀 많습니다.. 비슷하긴 한데..

1. 보통 어싱테스크가 다운로드같은 작업은 doInBackground()에서 하고 뒷처리 업데이트는 onPostExecute()에서 하잖아요

근데 안드로이드 개발시에 어싱테스크를 액티비티 내부에 private inner class로 넣어서 코딩하는게 좋지 않은 습관인가요?

2. 보통 onPostExecute()에서 액티비티의 UI를 업데이트 할때에 inner class인 어싱테스크가 outer class인 액티비티의 변수들에 접근하기가 쉬우니까.. 거의 코딩할때 inner class로 쓰는 경향이 생기는데.. 이게 좋지 않은가요?

3. 그리고 어싱테스크가 문제가 configuration change때 old 액티비티를 참조하기 때문에 메모리릭이 생기는걸로 아는데 이걸 방지하기 위해 weakReference를 쓰잖아요. 근데 어싱태스크가 inner class인 경우도 "항상" weakReference를 사용해서 액티비티를 참조해야 하나요? 어느 때에 weakReference 를 사용 하고 안하고 하나요?

4. 어싱태스크가 inner class일 경우는 static class로 할 필요는 따로 없나요?

5.그리고 보통 어싱태스크 클래스를 액티비티와 따로 둬서 사용할 경우에 weakReference는 액티비티를 참조하는게 나은가요 아님 Context를 참조하는게 나은가요? 아님 아무 상관도 없는건가요?

6. 마지막으로.. 어느 경우에 어싱태스크를 액티비티와 따로 구분해서(=inner class로 안 사용) 하나요? 뭐 어싱태스크 덩치가 너무 길어지는 경우 말고 또 있나요? 그리고 어싱태스크가 onPostExecute()에서 액티비티의 UI컴포넌트에 업데이트할게 많다면...

예를들어 FooActivity에서 BarAsyncTask를 따로 사용할 경우

BarAsyncTask내에서 WeakReference<Activity> ref를 관리하고 ref.get()을 사용해서 (FooActivity)ref.get() 으로 캐스팅한다음에 FooActivity 내부의 public 메서드를 불러서 이 메서드로 결과값을 전달하고 이 안에서 FooActivity의 UI를 업데이트 하는게 일반적인건가요?

 

질문이 좀 중구난방인데.. 이게 좀 이해가 될듯하다가도 안돼서..ㅠ 개념정리해주시면 감사하겠습니다..
ADR (360 포인트) 님이 2013년 10월 23일 질문

1개의 답변

0 추천
1. 아뇨

2. 네

하지만 여러 클래스에서 같은 작업을 하는 클래스라면 1번과 2번의 답이 반대로 바뀔듯 하네여

AsyncTask 는 따로 클래스로 만들고 onPostExecute에 대한 콜백을 만들어서 UI 변경 부분만

각각 콜백에서 처리하는게 좋을듯 하네여

나머지질문에 대해서는 저도 잘 모르겠슴다
Gradler (109,780 포인트) 님이 2013년 10월 23일 답변
...