2013-02-12 5 views
60

저는 프로그래밍에 익숙하지 않아 의심 스럽습니다.비동기 작업이 끝날 때까지 기다리십시오.

저는 AsyncTask입니다. 전화 번호는 RunInBackGround입니다.

와 나는 같은이 과정을 시작합니다

new RunInBackGround().execute(); 

을하지만이 호출이 코드의 다른 진술로 진행하기 전에, 실행 완료 될 때까지 기다려야 바랍니다.

어떻게하면됩니까?

다른 방법이 있습니까?

+0

AsyncTask의 포인트는 비동기 적이므로 나머지 코드와 동기화되지 않는다는 것입니다. – Gjordis

+2

AsyncTask 메서드의 onPostExecute()를 사용하여 클래스에서 콜백을 가져올 수 있습니다. – DcodeChef

+4

끝날 때까지 기다릴 필요가 없습니다. 당신이 원하는 것은 그것이 언제 끝나는지를 아는 것입니다. – njzk2

답변

97

대기이 호출 될 때까지 마무리의

당신은 다시 결과를 얻기를위한 AsyncTask.get() 메서드를 호출하고 doInBackground 실행이 완료되지 때까지 대기를 확인해야합니다 실행. 그러나 스레드 내에서 get 메소드를 호출하지 않으면 Main UI 스레드가 멈 춥니 다.. 코드를 병렬로 실행할 수 있다면 좋을 텐데 최적 있지만, 당신은 단순히 너무 스레드를 사용하고있는 경우 일 수있다

String str_result= new RunInBackGround().execute().get(); 
+1

결과를 기다리는 방법. 기본 UI 스레드가 잠겨 있지 않습니까? 코드가 결과를 기다리는 동안 잠시 동안 진행 막대가 계속 롤링됩니다. –

+2

@MuhammadNaderi :'AsyncTask'를'get' 메서드없이 사용하고 AsyncTask에서'onPostExecute' 메서드가 호출되어 메인 UI 스레드에서 결과를 제공합니다 –

+1

이것은 잠시 동안 사용해온 임시 해결책입니다. 코드가 asynctask를 기다릴 필요가 있습니다.'C#'에서'await'과 같이 쓰고 메인 스레드는 잠겨 있지 않아야합니다. –

29

: AsyncTask

다시 UI 스레드 시작에서 결과를 얻으려면 앱의 사용 흐름이 기다려야하는 경우에도 UI 스레드를 차단하지 않습니다.

여기에는 2 가지 옵션이 있습니다.

  1. 대기중인 코드는 AsyncTask 자체에서 실행할 수 있습니다. UI (스레드)를 업데이트해야하는 경우 onPostExecute 메서드를 사용할 수 있습니다. 배경 작업이 완료되면 자동으로 호출됩니다.

  2. Activity/Fragment/Whatever에서 어떤 이유로 든 강제로 수행하는 경우 사용자 지정 리스너로 만들어서 AsyncTask에서 브로드 캐스팅 할 수 있습니다. 이것을 사용하면 Activity/Fragment/Whatever 콜백 메소드를 원할 때만 호출 할 수 있습니다. 일명 AsyncTask가 기다려야하는 모든 작업을 마쳤습니다. 에서

+5

이것은 훌륭한 답변이며 받아 들여진 것이어야합니다. 또한 다음은 AsyncTasks를 사용하여이를 수행하는 방법을 보여주는 샘플입니다. http://stackoverflow.com/questions/12575068/how-to-get-the-result-of-onpostexecute-to-main-activity-because-asynctask-is -a –

13

당신의 AsyncTask처럼 일해서 ProgressDialog를 추가하여 ProgressDialog을 기각

this.dialog.setMessage("Processing..."); 
this.dialog.show(); 

하고 onPostExecute(Void result) 방법 : 당신이 좋아하는 onPreExecute() 방법 SetMessage() 할 수

private final ProgressDialog dialog = new ProgressDialog(YourActivity.this); 

.

+0

이 추가 정보를 제공해 주셔서 감사합니다. – AndroidBeginner

11

AsyncTask에는 4 가지 방법이 있습니다.

onPreExecute -- for doing something before calling background task in Async 

doInBackground -- operation/Task to do in Background 

onProgressUpdate -- it is for progress Update 

onPostExecute -- this method calls after asyncTask return from doInBackground. 

당신은 그것을 onPostExecute 당신이 구현해야 할 것입니다 doInBackground()

에서 돌아온 후 호출 onPostExecute()에 작업을 호출 할 수 있습니다.

관련 문제