2011-04-25 6 views
4

Im 메서드 내에서 스레드가 실행 중이며 일단 스레드가 끝나면 값을 반환하려는 경우 join()을 시도했지만 UI 스레드를 차단하는 문제가 발생합니다. 어떻게 스레드가 끝날 때까지 기다렸다가 UI 스레드를 차단하지 않고 값을 반환 할 수 있습니까?UI 스레드를 차단하지 않고 스레드가 완료 될 때까지 기다리는 중

Boolean foo(){ 

myThread mt = new myThread(); 
mt.start();  
return mt.isSentSuccessfully; 

} 
+0

(나는 그것을을 테스트하지 않았다). – mre

+0

몇 가지 코드를 추가했습니다. – Jimmy

+0

이 라운드를 돌리고 UI가 완료되었을 때 백그라운드 스레드 신호를 UI로 보내지 못하는 이유가 있습니까? (이것은 일반적인 일을하는 방식이므로 폴링을 피할 수 있습니다.) –

답변

4

Android의 AsyncTask을 사용할 수 있습니다. http://developer.android.com/reference/android/os/AsyncTask.html 사용할 때 배경 작업을 AsyncTask으로 확장하고 onPreExecute()onPostExecute(..) 메서드를 덮어 쓰고 ProgressDialog을 표시하거나 숨 깁니다. 그것은 아주 잘 작동합니다.

+0

나는 이미 그것을 보았지만, 나는 그것이 무엇을하려고하는지 가장 잘 맞는 것을 생각하지 않는다. 어떻게 끝내고 나서 호출하는 메소드 안에 값을 반환 할 수 있을까? – Jimmy

+0

이것이 가능한지 나는 모른다. UI를 차단하고 싶지 않지만 호출하는 메서드 (현재 활동 가능성이 높음)가 장기 실행 메서드를 호출하고 반환 할 때까지 기다리라고합니다. 장기 실행 스레드가 작업 완료시 Activity를 호출하도록 할 수 있습니다. – Haphazard

+2

@Fevos : 다른 스레드가 완료 될 때까지 차단하지 않으면 어떤 값을 반환 할 수 있습니까? 이 작업을 수행하는 유일한 방법은 UI 스레드에서 메서드를 호출하지 않고 백그라운드 스레드로 작업을 오프로드하는 것입니다 ... AsyncTask는 정확히 수행합니다. – blaze

3

당신이 정말로 AsyncTask를 사용하지 않으려는 경우에, 당신은 배경 작업이 같은 뭔가 완료되면 메인 쓰레드에 메시지를 보내 귀하의 백그라운드 스레드에서 다음 Handler

을 정의하는 것 같아서 :

ActivityMainThreadClassName.this.myUpdateHandler.sendMessage(m); 

여기서 myUpdateHandler는 작성한 처리기입니다.

0

Thread.getState()을 폴링 했습니까? 이 같은

뭔가 :

android.os.Handler h = new Handler(); 
h.postDelayed(new Runnable() { 
public void run() { 
     if (thread.getState() == Thread.State.TERMINATED) { 
      // your code here 
      return; 
     } 
     h.postDelayed(this, 1000); 
}, 1000); 

이 샘플은 스레드 상태를 매초마다 폴링해야 ... 일부 코드가 도움이 될 수 있습니다 제공

관련 문제