2013-07-05 5 views
0

우선, 나쁜 영어로 유감입니다. 나는 안드로이드 2.3을 가지고 있으므로 순차적 인 실행 대신에 "실제"병렬 AsyncTask가있다 (안드로이드 3.0 이상). 여러 개의 AsyncTask가 있는데, 각각은 onPostExecute() 콜백을 실행합니다 (UI 스레드에서 실행됨을 알고 있습니다). 2 개의 병렬 AsyncTask 만 있고 첫 번째 작업이 해당 작업을 완료하면 콜백 onPostExecute()가 호출됩니다. 첫 번째 AsyncTask의 onPostExecute() 메서드가 UI 스레드에서 실행되는 동안 두 번째 작업이 첫 번째 AsyncTask의 onPostExecute()의 현재 실행을 방해하는 onPostExecute() 메서드를 호출 할 수 있습니까?여러 AsyncTask의 onPostExecute 주문

// 업데이트] 은 지금 코드로 설명합니다

// AsyncTask1 
onPostExecute(Result result) { 
    activity->processResult1(result); 
} 

// AsyncTask2 
onPostExecute(Result result) { 
    activity->processResult2(result); 

한다고 가정 AsyncTask1가 작업을 완료하고 processResult1()가 매우 긴 방법 실행되고 있는지 : 우리는 UI 스레드에서 processResult1()를 실행하는 동안, AsyncTask2는 작업을 완료합니다. 지금은 어떻게됩니까?

  1. processResult1는() processResult2()
  2. processResult2()에 의해 중단됩니다) (processResult1 때까지 기다립니다 "잘못"진짜 "그래서 거기에"

답변

2

AsyncTaskdoInBackground 메서드가 완료되면 Runnable 메서드 (onPostExecute 메서드 실행)를 UI 스레드에 게시합니다. "게시"란, Runnable 대기열이 있음을 의미합니다. 이는 해당 방법 (onPostExecute)이 순차적으로 (차례대로) 실행된다는 것을 의미합니다. 따라서 하나의 onPostExecute 메서드는 다른 스레드를 인터럽트 할 수 없습니다 (이미 UI 스레드에 게시 된 경우).

+0

그러나 onPostExecute 메소드에서 실행되는 하나의 실행 가능 객체는 UI 스레드를 실행하는 다른 비동기 태스크를 인터럽트 할 수 있습니다. 나는 이것이 사이러스가 묻는 것이라고 생각했다. –

+0

@ 윌리엄 모리슨 네, 바로 당신입니다. 그러나, 나는 Cyrus가 두 가지 완료된 작업에 대해 묻고 있다고 생각합니다. –

+0

@CyrusSmith 나는 내 대답을 약간 편집했습니다. 나는 그 ** 방법 **을 의미하지, 그들 자신이 아니라 태스크 –

1

먼저 끝납니다. 소위 "진짜"비동기 taks는 안드로이드의 더 높은 버전에서 많은 속임수없이 사용할 수 있습니다, 당신은 단지 하나가 변경된 것처럼 다른 방식으로 그것을 호출 할 필요가 있습니다.

+0

그래, 나는 그들이 더 높은 버전에서 사용할 수 있다는 것을 알고있다. 나는 단지 기본 행동에 대해 이야기하고있다. –

+0

안드로이드 워드 프로세서에서 이것을 발견했습니다 : "AsyncTask는 모든 콜백 호출이 다음 작업이 명시 적 동기화없이 안전하도록 동기화됩니다." 하나의 onPostExecute()가 다른 onPostExecute()에 의해 중단 될 수 없다는 것을 의미합니까? (예, 이벤트 처리와 같은 다른 작업에 의해 중단 될 수 있음을 알고 있습니다.) –

+0

@CyrusSmith, 예. 그것은 나의 해석 일 것이다. Marcin은 정확합니다. –

0

이 읽기 ​​: 처음 소개 할 때, AsyncTasks는 단일 백그라운드 스레드에서 순차적으로 실행 된

: (안드로이드 문서 here에서 복사). DONUT으로 시작하여 여러 스레드가 병렬로 작동 할 수 있도록 스레드 풀로 변경되었습니다. HONEYCOMB부터는 병렬 실행으로 인한 공통 응용 프로그램 오류를 피하기 위해 단일 스레드에서 작업이 실행됩니다.

실제로 병렬 실행을 원할 경우 THREAD_POOL_EXECUTOR을 사용하여 executeOnExecutor (java.util.concurrent.Executor, Object [])를 호출 할 수 있습니다.

여러 AsyncTasks을 실행하면, 그들은 동시에 경우 장치를 실행은 DONUT < = 장치 API를 < 벌집입니다. 이것은 안드로이드가 단일 스레드가 아닌이 버전에서 여러 백그라운드 스레드를 사용하여 AsyncTasks를 실행하기 때문입니다. 결과적으로, GUI 스레드에서 작업이 동시에 실행되기 때문에 시작된 순서대로 작업이 반드시 실행되지는 않는다고 가정합니다. 그러나 이것은 교훈있는 추측이며, 나는 이것을 확실히 알지 못합니다.

장치 소프트웨어가 < DONUT 또는> = HONEYCOMB이면 작업은 시작된 순서대로 GUI 스레드에 게시됩니다. 이러한 버전에서는 모든 AsyncTask가 하나의 백그라운드 스레드에서 실행되므로 독립적으로 실행되지 않기 때문입니다.서로 하나 AsyncTask를 취소하기 위해 가능한 모든 버전에서

:

이제 부분 난 당신에 대해 물어 것 같아요. 그러나 버전> = DONUT 및 < HONEYCOMB에서 AsyncTask가 동시에 실행되므로 인터럽트하려고하는 작업이 이미 완료되었을 수 있습니다.

두 스레드가 하나의 스레드이므로 GUI 스레드에서 동시에 실행할 수는 없습니다. 하나의 AyncTask가 완료되면 다른 AsyncTask가 GUI 업데이트를 수행하지 못하게하는 플래그를 throw 할 수 있지만 GUI 스레드에서 작업이 짧아야하므로 좋지 않은 접근 방법입니다.

+0

OP 질문을받지 못했습니다. –

+0

나는 동의하지 않는다. 나는 그가 적절하게 대답 할 수 있다고 생각한다. 어떻게 비슷한 일을 할 수 있는지, 왜 그가하려고하는 것이 불가능한지를 철저히 설명한다. –

+0

그 차이점에 대해 알고 있습니다. 이 질문은 UI 스레드에서 실행되는 onPostExecute() 메소드 순서에 관한 것입니다. 내 나쁜 질문 공식화에 대한 죄송합니다, 그리고 해답을 주셔서 감사합니다. –

관련 문제