비동기 작업이 작업을 마칠 때까지 대기


85

저는 프로그래밍을 처음 접했고 의심이 있습니다.

나는 AsyncTask내가라고 부르는 것을 가지고 있습니다 RunInBackGround.

이 프로세스를 다음과 같이 시작합니다.

new RunInBackGround().execute();

그러나 다른 코드 명령문으로 진행하기 전에이 호출이 실행을 마칠 때까지 기다리고 싶습니다.

어떻게 할 수 있습니까?

그것에 대한 방법이 있습니까?


2
AsyncTask의 요점은 비동기식이므로 나머지 코드와 동기화되지 않는다는 것입니다.
Gjordis 2013.02.12

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

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

3
@DcodeChef는 질문에서 그가 원하는 것을 이해 한 유일한 사람입니다.
Please_Dont_Bully_Me_SO_Lords

1
나는 이것이 당신이 찾고있는 해답이라고 생각 stackoverflow.com/questions/13079645/...
user3362415

답변:


130

이 호출이 실행을 마칠 때까지 기다리십시오.

결과를 되돌리려면 AsyncTask.get () 메서드 를 호출 하고 doInBackground실행이 완료되지 않을 때까지 기다려야 합니다. 그러나 Thread 내부에서 get 메서드를 호출하지 않으면 Main UI 스레드가 고정됩니다 .

UI 스레드 에서 결과를 다시 얻으려면 AsyncTask다음과 같이 시작하십시오 .

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

3
그래서 결과를 기다리고 메인 UI 스레드를 잠그지 않는 방법은 무엇입니까?! 코드가 결과를 기다리지 만 그 동안 진행률 표시 줄이 계속 회전한다고 말합니다!
Muhammad Naderi

2
@MuhammadNaderi : 메서드 AsyncTask없이 get사용하고 AsyncTask onPostExecute메서드에서 호출하여 기본 UI 스레드에 u 결과를 제공합니다
ρяσѕρєя K

3
이것이 제가 한동안 사용하고있는 해결 방법이라는 것을 확신합니다.하지만 때때로 코드가 awaitin c#과 같은 asynctask를 기다리며 물론 메인 스레드를 잠그지 않도록 코드가 필요합니다.
Muhammad Naderi

2
@ ρяσѕρєяK 감사합니다, 감사합니다. 당신은 내가이 문제에 대해 얼마나 많은 머리카락을 당겼는지 알지 못합니다. 그러나 단 하나의 .get ()으로 해결되었습니다 (농담합니다) 단 하나의 .get () !!!!!
Code_Worm

AsyncTask를 사용하고 UI가 멈추는 것을 방지하기 위해 get ()을 사용하지 않으려면 어떻게해야합니까?
아르 준 Issar

36

코드가 병렬로 실행되는 것이 가장 좋겠지 만, 앱의 사용 흐름이 기다려야하는 경우에도 UI 스레드를 차단하지 않도록 단순히 스레드를 사용하는 경우 일 수 있습니다.

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

  1. AsyncTask 자체에서 기다리는 코드를 실행할 수 있습니다. UI (thread) 업데이트와 관련이있는 경우에는 onPostExecute 메서드를 사용할 수 있습니다. 백그라운드 작업이 완료되면 자동으로 호출됩니다.

  2. 어떤 이유로 Activity / Fragment / Whatever에서 강제로 수행해야하는 경우 AsyncTask에서 브로드 캐스트하는 사용자 지정 리스너로 만들 수도 있습니다. 이것을 사용하면 Activity / Fragment / Whatever에서 원할 때만 호출되는 콜백 메서드를 가질 수 있습니다. 즉, AsyncTask가 기다려야하는 모든 작업이 완료 될 때 호출됩니다.


6
이것은 대단한 대답이며 받아 들여 져야합니다. 또한 다음은 AsyncTasks를 사용하여이를 달성하는 방법에 대한 샘플입니다. stackoverflow.com/questions/12575068/…
Jose Gonzalez

두 번째 옵션에서 수신자에게 의도를 던지는 동안 메인 스레드가 올바르게 재개됩니다. OP는 필요하지 않습니다.
LincyTonita

16

다음 AsyncTask과 같은 ProgressDialog를 추가 하십시오 .

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

다음 onPreExecute()과 같은 방법으로 setMessage를 사용할 수 있습니다 .

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

귀하의 onPostExecute(Void result)방법 에서 귀하 의 ProgressDialog.


15

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

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는 구현해야하는 것입니다.


1

가장 쉬운 방법은 onpostexecute에서 데이터를 가져오고 interface에서 Ui를 실행하는 인터페이스를 만드는 것입니다.

인터페이스 생성 :

public interface AsyncResponse {
    void processFinish(String output);
}

그런 다음 asynctask에서

@Override
protected void onPostExecute(String data) {
    delegate.processFinish(data);
}

그런 다음 주요 활동에서

@Override
public void processFinish(String data) {
     // do things

}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.