2012-05-18 2 views
1

일부 백그라운드 처리를 위해 AsyncTask 하위 클래스를 사용하고 있습니다. 문제는 .get() 메서드를 사용하여 클래스를 사용할 때 onPreExecute()에 지정된 ProgressDialog이 표시되지 않는다는 것입니다.AsyncTask ProgressDialog가 .get()으로 표시되지 않음

onPostExecute() 메서드를 사용하는 콜백을 사용하면 정상적으로 작동합니다.

첫 번째 생각은 .get()이 프로세스가 완료 될 때까지 대기하지만 UI 스레드를 차단할 수 없기 때문입니다.

누구나이 동작이 왜 그런지 설명하고이 문제를 해결할 수있는 방법이 있습니까? 가능한 경우 .get() 메서드를 사용하고 싶습니다.

답변

3

처음에는 다른 답변을 수락했지만 잘못된 것으로 보입니다.

.get() 메서드는 결과를 기다리는 UI 스레드를 차단하고 표시되는 대화 상자도 차단됩니다. 이것은이 메서드에서 예상되는 동작입니다.

유일한 대안은 배경 작업이 눈에 띄는 시간 동안 발생하고 호출 작업에 콜백 메서드를 사용하는 경우 .get()을 사용하지 않는 것입니다.

1

UI 스레드에서 AysncTask.get()을 호출하면 UI 스레드 실행이 차단되고 UI 스레드가 AysncTask.doInBackground()가 완료 될 때까지 대기하게됩니다. 이렇게하면 실제로 AsycnTask의 이점을 희생합니다. 이제는 모든 코드가 UI 스레드와 백그라운드 스레드에서 동시에 실행됩니다 (여전히 두 개의 스레드이지만 UI 스레드는 백그라운드 스레드를 대기합니다).

또한 UI 스레드에서 get()을 호출하면 5 초 이상 차단 된 ANR 예외가 발생합니다. 이 도움이

showDialog(); 
myAsyncTask.execute(); 
myAsyncTask.get(); // <-- UI thread blocked and wait at this point. 
dismissDialog();// <-- This line will be executed after doInBackground() finish. 

희망 : 당신이 정말로 그것을 사용하는 경우

는 myAsyncTask.get 전에이 ShowDialog()() 메서드를 호출합니다.

+0

그래,하지만 UI 스레드가 차단 된 경우이 경우 대화 상자가 표시되는 이유는 아직 알 수 없습니다. –

+0

여기 요점은 UI 스레드에서 showDialog()를 호출 할 위치입니다. 블록 포인트 (AsyncTask.get())를 사용하면 문제없이 표시됩니다. – yorkw

+0

작동하지 않습니다 .... –

관련 문제