: 타스크 인스턴스 •
는 UI 스레드에서 생성해야합니다.
doInBackground()는 백그라운드 스레드에서 실행됩니다. 따라서 doInBackground()에서 또 다른 asynctask를 생성하고 실행할 수 없습니다.
http://developer.android.com/reference/android/os/AsyncTask. 스레딩 규칙 아래의 주제를 살펴보십시오. 비동기 태스크가 실행될 때
는 태스크 4 단계를 진행한다 :
1.onPreExecute (스트레이트 다큐먼트로부터)(), 작업이 실행되기 전에 UI 스레드 불려. 이 단계는 일반적으로 사용자 인터페이스에 진행률 표시 줄을 표시하여 작업을 설정하는 데 사용됩니다.
2. doInBackground (Params ...), onPreExecute() 실행이 끝난 직후 백그라운드 스레드에서 호출됩니다. 이 단계는 오랜 시간이 걸릴 수있는 백그라운드 계산을 수행하는 데 사용됩니다. 비동기 작업의 매개 변수가이 단계로 전달됩니다. 계산 결과는이 단계에서 리턴되어야하며 마지막 단계로 다시 전달됩니다. 이 단계에서는 publishProgress (Progress ...)를 사용하여 하나 이상의 진행 단위를 게시 할 수 있습니다. 이 값은 UI 스레드의 onProgressUpdate (Progress ...) 단계에 게시됩니다.
3.onProgressUpdate (Progress ...) publishProgress (진행 ...) 호출 후 UI 스레드에서 호출됩니다. 실행의 타이밍은 정의되지 않습니다. 이 메소드는 백그라운드 계산이 아직 실행 중일 때 사용자 인터페이스에 진행 상태를 표시하는 데 사용됩니다. 예를 들어 진행률 표시 줄에 애니메이션을 적용하거나 텍스트 필드에 로그를 표시하는 데 사용할 수 있습니다.
4. 배경 계산이 끝난 후 UI 스레드에서 호출되는 4.onPostExecute (결과). 백그라운드 계산의 결과는이 단계에 매개 변수로 전달됩니다.
처음 소개되었을 때, AsyncTasks는 단일 백그라운드 스레드에서 연속적으로 실행되었습니다. DONUT으로 시작하여 여러 스레드가 병렬로 작동 할 수 있도록 스레드 풀로 변경되었습니다. HONEYCOMB부터는 병렬 실행으로 인한 공통 응용 프로그램 오류를 피하기 위해 단일 스레드에서 작업이 실행됩니다.
정말로 병렬 실행을 원할 경우 THREAD_POOL_EXECUTOR을 사용하여 executeOnExecutor (java.util.concurrent.Executor, Object [])를 호출 할 수 있습니다.
대체 RoboSpice을 사용할 수도 있습니다. https://github.com/octo-online/robospice.
여러 가지 향신료 요청을 할 수 있습니다. 작업이 완료되면 UI 스레드의 Notitifes. Robospice를 볼만한 가치가 있습니다.
여러 가지 대안과 함께 매우 훌륭하고 철저한 응답. 다시 한 번 감사드립니다 Raghunandan – JoeyL
+1 이와 같은 포괄적 인 대답. AsyncTask 클래스는 UI 스레드에로드해야합니다. 이 작업은 자동으로 JELLY_BEAN.' (문서)에서 수행됩니다. 자동으로 수행되는 작업을 알고 있습니까? –
@ David Caunt가 http://stackoverflow.com/questions/14978924/what-is-the-difference-between-loading-and-creating-asynctask-on-the-ui-thread 링크를 확인하십시오. – Raghunandan