마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

쓰레드 실행순서 제어(동기화) 관련 질문

0 추천

안녕하세요.

activity에서 동영상 재생을 할때 url을 다시 읽어와서 재생시키는 내용인데요,

간략한 코드는 아래와 같습니다.

public void onClick(View v) {   
....   

   Thread t = new ThreadPlayVideo(view);
   
   if(!isUrlValid(view.cur_page_item())){          
...    
    t.start();    
    try{
     t.join();
    } catch(Exception e){
     
    }
   }   
         
   play_video();
   }
class ThreadPlayVideo extends Thread{
...
  public void run(){
   detail_view.content_url_.request(detail_view.cur_entry_item_.getLinkAlternate());
  }  
 }

 

기대하는 실행순서는,

t.start() =>스레드 실행

detail_view.content_url_.request() ==> 리스너실행 됨 

위 리스너에서 oncomplete() 수행 후, play video() 실행.

이렇게 되어야 하는데

 

현재는

t.start() =>스레드 실행

detail_view.content_url_.request() ==> 리스너실행 됨 

play video()실행

리스너 oncomplete() 옴

 

이렇게 실행이 되어서 바뀐 주소가 오기전에 이미 play를 해버립니다.

t.join을 하면, t가 실행하는 동작이 끝날때까지 기다린다고 해서 저렇게 구조를 변경했는데도

제대로 동작을 안하네요.

혹시 이유를 아시는 분 있나요? ㅠㅠ

탯탯탯 (430 포인트) 님이 2013년 7월 31일 질문

1개의 답변

0 추천
thread 의 종료 시점이 oncomplete 인데도 저러는 건가요?

 

개인적으로는 join 말고 oncomplete 가 리스너라면 해당 위치에서 play 시켜도 무방할거로 보입니다.

onclick 안에서 join 을 하게 되면 아무래도 ui 쪽에 문제가 있을 테니깐요
aucd29 (218,390 포인트) 님이 2013년 7월 31일 답변
oncomplete 안에서 play를 할 수 없는 이유가.. 있어서요...ㅎㅎ
참 이해안되는게 최악의 방법으로 !isurlvalid(){} 안에서 oncomplete가 올때까지 while을 걸어봤는데.. while을 걸면 oncomplete가 안오네요...
...