2014-02-17 1 views
-1

짧은 시간에 3 번 이미지 뷰를 변경하려고합니다. 나는 이미지를 설정하고 "Bazinga"라고 말한 다음 오디오가 완료된 직후 이미지 뷰를 변경하려고합니다. 그런 다음 두 번째로하고 싶습니다. 첫 번째 이미지는 이미이 함수를 호출하기 전에 설정 참고 :이미지 뷰가 업데이트되지 않습니다. `invalidate(); '를 사용하려했지만 작동하지 않았습니다.

sound = MediaPlayer.create(this, R.raw.bazinga); 
sound.start(); 
page.setImageResource(R.drawable.counttotwofirst); 
while(sound.isPlaying()){} 

sound.start(); 
page.setImageResource(R.drawable.counttotwosecond); 
while(sound.isPlaying()){} 
sound.release(); 

page.setClickable(true); 

나는 invalidate();를 사용하려했지만 그것은 작동하지 않았다.

강제로 업데이트하거나 이미지 뷰가 업데이트 될 때까지 기다려야합니까? imageviews의 업데이트 간격은 얼마나됩니까? 대신 사용해야하는 다른보기가 있습니까?

+0

UI 스레드가 멈추었습니까? – donfuxx

+1

당신은 3 회 반복하지 않고 30 억 회 반복해야한다고 상상해보십시오. 그것은 당신의 루프가 영원히 잠잠해질 것이라는 것을 의미 할 것입니다. 그러나 나머지 코드는 어떻게 될까요? 결코 실행되지 않을 것입니다. 당신이 지금하고있는 일을 잘못 보았습니까? – pskink

+0

힌트 : [MediaPlayer.OnCompletionListener] (http://developer.android.com/reference/android/media/MediaPlayer.OnCompletionListener.html)를 사용해보십시오. – donfuxx

답변

0

디자인을 약간 다시 생각해야합니다. 귀하의 응용 프로그램의 메인 (UI) 스레드에서 모든 코드를 실행하고 있다고 생각합니다. 문제는 이미지 리소스를 변경하더라도 UI 스레드가 차단 (while() 루프에 위치)하게되므로 전체 함수가 반환 될 때까지 UI 업데이트가 수행되지 않습니다. 원하는 사운드/애니메이션 효과를 얻으려면 더 많은 조각이 필요할 것입니다. 내 머리 꼭대기에서 사운드로드/재생을 수행하는 백그라운드 스레드를 만들어 UI 스레드에서 수행하지 않도록하십시오. 또한 사운드가 끝날 때까지 while() 루프에 앉아있는 대신 재생이 완료되었음을 콜백하도록하는 것이 좋습니다 (MediaPlayer :: setOnCompletionListener() 참조).

관련 문제