매우 좋은 질문입니다. Android 프로그래머로서 문제를 완전히 이해하려면 시간이 걸립니다. 실제로 AsyncTask에는 관련된 두 가지 주요 문제가 있습니다.
- 활동 수명주기와 잘 연결되어 있지 않습니다.
- 그들은 매우 쉽게 메모리 누수를 만듭니다.
내부 RoboSpice (동기 부여 응용 프로그램 Google Play에서 사용할 수 ) 우리는 세부에서 그 질문에 대답. AsyncTasks, 로더, 기능 및 단점에 대한 심층적 인보기를 제공하고 네트워크 요청에 대한 대체 솔루션 인 RoboSpice를 소개합니다. 네트워크 요청은 Android의 일반적인 요구 사항이며 본질적으로 장기 실행 작업입니다. 다음은 앱에서 발췌 한 것입니다.
AsyncTask 및 활동 수명주기
AsyncTask는 활동 인스턴스의 수명주기를 따르지 않습니다. 활동 내에서 AsyncTask를 시작하고 장치를 회전하면 활동이 파괴되고 새 인스턴스가 생성됩니다. 그러나 AsyncTask는 죽지 않을 것입니다. 완료 될 때까지 계속 살아갑니다.
완료되면 AsyncTask는 새 활동의 UI를 업데이트하지 않습니다. 실제로 더 이상 표시되지 않는 활동의 이전 인스턴스를 업데이트합니다. 이로 인해 java.lang.IllegalArgumentException 유형의 예외가 발생할 수 있습니다. 예를 들어, 활동 내에서보기를 검색하기 위해 findViewById를 사용하는 경우 창 관리자에보기가 첨부되지 않습니다.
메모리 누수 문제
AsyncTask를 활동의 내부 클래스로 만드는 것은 매우 편리합니다. AsyncTask는 작업이 완료되거나 진행 중일 때 Activity의 뷰를 조작해야하므로 Activity의 내부 클래스를 사용하는 것이 편리해 보입니다. 내부 클래스는 외부 클래스의 모든 필드에 직접 액세스 할 수 있습니다.
그럼에도 불구하고 내부 클래스는 외부 클래스 인스턴스 인 Activity에 대해 보이지 않는 참조를 보유 할 것임을 의미합니다.
장기적으로 이로 인해 메모리 누수가 발생합니다. AsyncTask가 오래 지속되면 활동이 "살아있는"상태를 유지하는 반면 Android는 더 이상 표시 할 수 없기 때문에이를 제거하려고합니다. 활동은 가비지 수집 될 수 없으며 Android가 기기의 리소스를 보존하는 중심 메커니즘입니다.
장기 실행 작업에 AsyncTasks를 사용하는 것은 정말 매우 나쁜 생각입니다. 그럼에도 불구하고 1 ~ 2 초 후에 View를 업데이트하는 것과 같이 수명이 짧은 경우에는 괜찮습니다.
RoboSpice Motivations 앱 을 다운로드하는 것이 좋습니다.이 앱 은이를 심층적으로 설명하고 일부 백그라운드 작업을 수행하는 다양한 방법에 대한 샘플 및 데모를 제공합니다.
doInBackground
는 진행률 표시 줄을 사용하지 않으면 장기 실행 기능이 화면을 고정한다는 것입니다.