2012-11-23 21 views
4

當聲音結束時,我需要更改ImageView,但是當我嘗試使用線程來使用它時,會凍結應用程序關閉的screem;當聲音以線程結束時如何更改imageView

mp = MediaPlayer.create(this, R.raw.ave_maria); 
    mp.start(); 
    im = (ImageView) findViewById(R.id.imag1); 

    Thread thread = new Thread() { 
     public void run() { 

      while (mp.isPlaying()) { 

      } 
      im.setImageResource(R.drawable.primeiro_misterio_gozoso07); 
     } 
    }; 
    thread.start(); 

回答

2

您應該將代碼與線程UI同步。

mp = MediaPlayer.create(this, R.raw.ave_maria); 
    mp.start(); 
    im = (ImageView) findViewById(R.id.imag1); 

    Thread thread = new Thread() { 
     public void run() { 

      while (mp.isPlaying()) { 

      } 
      //YouActivity 
      YouActivity.this.runOnUiThread(new Runnable() { 

      public void run() { 
       im.setImageResource(R.drawable.primeiro_misterio_gozoso07); 

      } 
    }); 

     } 
    }; 
    thread.start(); 
+0

謝謝!就是那個! – RWillamy

0

可以使用的AsyncTask,它是從Android的一個非常有用的類併爲您提供覆蓋3種方法(onPreExecute,doInBackground和onPostExecute)的可能性。

您可以在聲音播放過程中使用doInBackground,並在onPostExecute中設置圖像。

更好的是,您可以使用onPreExecute在進度對話框或類似的東西上顯示一些好東西。

對於的AsyncTask,請參閱:http://developer.android.com/reference/android/os/AsyncTask.html

+0

還有一個來自我的問題+1。 –

4

使用OnCompletionListener MP物體上:

mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { 
      @Override 
      public void onCompletion(MediaPlayer mp) { 

      // SET THE BACKGROUND HERE 
      } 
     }); 
1

不能在UI從後臺線程改變。此外,MediaPlayer還提供了一個OnCompletionListener接口,您應該使用它而不是while循環。事實上,如果你使用onCompletionListener,你甚至不必把它放在它自己的線程中,這樣你就不用擔心如何改變UI。

這樣的事情應該很好地工作:

mp.setOnCompletionListner(new OnCompletionListner() { 
    public void onCompletion(MediaPlayer m){ 
     im.setImageResource(R.drawable.primeiro_misterio_gozoso07); 
    } 
});