2013-03-27 4 views
1

최근에 대답 to the same question here을 찾기 위해 너무 훑어 보았습니다.하지만 그렇게 할 위험에 관한 질문에 대한 답변은 없었습니다. 하지만 기본적으로 다른 AsyncTaskdoInBackground() 방법 안에 또 다른 AsyncTask을 실행하고 싶습니다. 이것은 나쁜 접근인가요? 그리고/또는 잠재적 인 부작용을 남기고 있습니까?doInBackground 내에서 다른 AsyncTask 만들기

내가 아는 그 onPostExecute() 작품에서 실행 지금까지 과거의 경험에서 내가 사실로 인해 어떤 문제가 있었하지 않은 다시 시작하는 AsyncTask을 시작했다 메인 스레드에 onPostExecute() 실행됩니다. 은 API 문서에서

답변

4

: 타스크 인스턴스 •

는 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를 볼만한 가치가 있습니다.

+0

여러 가지 대안과 함께 매우 훌륭하고 철저한 응답. 다시 한 번 감사드립니다 Raghunandan – JoeyL

+0

+1 이와 같은 포괄적 인 대답. AsyncTask 클래스는 UI 스레드에로드해야합니다. 이 작업은 자동으로 JELLY_BEAN.' (문서)에서 수행됩니다. 자동으로 수행되는 작업을 알고 있습니까? –

+0

@ David Caunt가 http://stackoverflow.com/questions/14978924/what-is-the-difference-between-loading-and-creating-asynctask-on-the-ui-thread 링크를 확인하십시오. – Raghunandan

1

Hynccomb 릴리스를 제외한 AsyncTask()는 연속적으로 실행됩니다. doInBackground()에서 다른 AsyncTask()를 실행할 수 없습니다. 시도하지 않았다고 말하면 좋겠지 만 원하는 효과를 얻지는 않을 것입니다.

Google 업무 시간 중 하나에서 AsyncTask() 실행에 대해 질문했습니다. 입에서 곧바로, "왜 직렬에서 병렬로 그리고 다시 직렬 실행으로 바뀌 었습니까?" "그것은 많은 것들을 깨뜨 렸기 때문에."

+1

이것은 완전히 사실이 아닙니다. execute 메소드는 기본 executor에서 작업을 실행합니다.이 executor는 Honeycomb 이후 단일 스레드 (직렬) 실행 프로그램 일 것입니다. 그러나 [executeOnExecutor] (https://developer.android.com/reference/android/os/AsyncTask.html#executeOnExecutor (java.util.concurrent.Executor, % 20Params ...))를 사용하여 자신의 집행자에서 작업을 실행할 수 있습니다.). 이것은 병렬로 안전하게 수행 할 수있는 작업에 적합합니다. –

+0

@DavidCaunt 100 % 사실입니다. +1은 계속 간단하게하려고했습니다. :) –

관련 문제