2013-08-02 3 views
0

나는 andorid 프로그래밍에 익숙하지 않다. AsyncTask의 내부에서 반환 값 함수를 호출하는 데 문제가있다. doInBackground() 간단한 질문은 AsyncTask가 완료 될 때까지 기다린 다음 return 문을 실행하는 방법이다. UI를 고정시키지 않고도 onPostExecute()을 공부했지만 문제가 해결되지 않았습니다. 다음 당신은 AsyncTask를의 onPostExecute()에서 인터페이스 및 반환 값을 만들거나 당신이 브로드 캐스트 리시버를 등록하고 AsyncTask를의 onPostExecute() 방법에서 해고 할 수AsyncTask에서 반환 값 함수를 호출하는 방법

public String hello() { 
String result = null; 
//calling asynctaske execute method 
retrun result; 
} 
+0

이것은 비동기적인 AsyncTask의 목적을 상실합니다. 작업이 나중에 끝날 수 있으므로 아무 것도 반환하지 않습니다. 안녕 방법은 AsyncTask를 시작하고 onPostExecute()는 UI 스레드에서 뭔가를 실행하여 출력을 표시하는 데 필요한 것을 수정합니다. 그러므로 hello()는 리턴 타입을 가질 수 없다. – Guykun

+0

asicktask가 끝나면 onPostexecute() 메서드가 호출됩니다. 그러면 onPostExecute() 내에서 값을 확인할 수 있습니다. – Srinivasan

+0

예요.하지만 할당 된 적이 있지만 while (result == null) {} (UI가 고정되어 있기 때문에) 다음 문장을 실행하는 방법을 알려주세요. – Khan

답변

0

나는 callback 함수를 사용하여이 작업을 수행합니다.이 함수는 onPostExecute 후에 호출합니다.

public AsyncUnzip(Activity ctx, Observer callback) { 
    this.ctx = ctx; 
    this.callback = callback; 
} 

@Override 
protected void onPreExecute() { 
    super.onPreExecute(); 
    dia = new ProgressDialog(ctx); 
    dia.setTitle("Bitte warten"); 
    dia.setMessage("Geodatenpaket wird entpackt..."); 
    dia.setCancelable(false); 
    dia.show(); 
} 

및 비동기 작업의 전화가 같을 것이다이 경우

@Override 
public void onPostExecute(Boolean result) { 
    super.onPostExecute(result); 
    dia.dismiss(); 
    callback.update(null, returnFolder); 
    System.out.println("Unzipped to: " + returnFolder.getName()); 
} 

:

AsyncUnzip unzipThread = new AsyncUnzip(ImportActivity.this, new Observer() { 
    @Override 
    public void update(Observable observable, Object data) {//your code invoked after Async Task 
} }); 
unzipThread.execute(selectedFile); //Start Unzip in external Thread. 

참고 : 이것은 관찰자가없는 익명의 Observer 구현을 사용하는 빠르고 diry 솔루션입니다.

+0

솔루션에서 asyncTask 이후 직접 작업을 완료했지만 문자열을 반환해야합니다. 호출 함수를 호출하고 그 작업을 수행 할 것입니다. – Khan

+0

Asynconus 스레드가 시작되고 메서드 업데이트 (..) {}의 코드가 실행 된 후 .execute (..) 이후 코드가 실행됩니다. 비동기 작업에 finisehd가 있습니다. –

0

샘플 코드를입니다. Interface와 BroadcastReceiver를 사용하여 demo을 만들었습니다. 다운로드하고 확인하실 수 있습니다.