Development Tip

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

yourdevel 2020. 10. 13. 19:29
반응형

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


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

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

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

new RunInBackGround().execute();

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

어떻게 할 수 있습니까?

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


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

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

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

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

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

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

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

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


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

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

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

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

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


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


가장 쉬운 방법은 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

}

참고 URL : https://stackoverflow.com/questions/14827532/waiting-till-the-async-task-finish-its-work

반응형