2012-09-17 1 views
0

AsyncTask를 사용하여 문자열을 다운로드하고 문자열을 반환하려고합니다. AsyncTask를 사용하려면 잠시 시간이 걸릴 수 있습니다.AsyncTask에서 결과 얻기

하나의 문제는 인터넷 어디에도 아무런 값을 반환하지 않는 AsyncTask 예제를 찾을 수 있다는 것입니다. 그래서 Commonsware 책의 예제를 가져다가 값을 반환하도록 수정하고 다음과 같이 내가 가치를 얻을이 작동하는 동안

String mystr = new AddStringTask().execute().get(); 

, 코드 줄은 반환 값을 기다리고 따라서 것처럼 보일 동기. AddStringTask의 결과와 함께 이벤트 트리거를 갖는 방법이 있어야합니다.

어떻게 완료 되나요? 감사, 게리

+0

이 질문 참조 http://stackoverflow.com/questions/9447646/how-do-i-send-data-back-from-onpostexecute-in-an-asynctask/9447833#9447833 –

답변

2

AsyncTask은 작업이 끝나기 전에 기다려야 할 반환 값을 얻기 때문에 값을 반환 할 수 없습니다. 그러면 AsyncTask은 의미가 없습니다.

대신 코드를 onPostExecute() (UI 스레드에서 실행됩니다. 걱정할 필요가있는 경우)로 이동해야합니다. 여기에서 doInBackground()에 의해 반환 된 값을 처리하며 일반적으로 UI를 업데이트하거나 오류 메시지를 표시합니다.

+0

그것을 얻으십시오. onPostExecute는 UI 스레드에 있으며 Microsoft WCF 환경에서 _completed 이벤트와 유사합니다. –

+0

활동에서 AsyncTask의 결과를 얻는 또 다른 방법. 블로그에 글을 쓰고 추가 할 수 있습니다. 당신은 아래 링크를 참조 할 수 있습니다 http://smartphonebysachin.blogspot.in/2012/11/how-to-return-value-from-async-task-in.html –

0

또한보다 일반적인 AsyncTask를 구현하려는 경우 다음과 같이 구현하여 활동 내에서 코드를 분류 할 수 있습니다. AsyncTaskListener이 활동에 OnClickListener를이 될 것 같은 방식으로 구현 완료라는 하나 개의 함수와 인터페이스입니다

@Override 
protected void onPostExecute(Bitmap r){ 
    if (r != null) { 
     processListeners(r); 
    } 
} 

protected void processListeners(Object data) { 
    for (final AsyncTaskDone l : listeners) l.finished(data); 
} 

public void addAsyncTaskListener (final AsyncTaskDone l){ 
    listeners.add(l); 
} 

.

+0

활동. 이것은 보존 된 조각과 같은 것으로부터 가장 잘 사용됩니다. – CommonsWare

+0

참 - 회전의 경우 가장 좋은 해결책은 로더 클래스를 구현하는 것입니다. –

+0

'Loader' 프레임 워크는 실제로'ContentProviders '에서만 잘 작동하고 다른 것은 덜 효율적이기 때문에이 말을하지 않겠습니다. – CommonsWare