2013-03-30 80 views
1

我有一個應用程序替換圖像並單擊按鈕播放聲音,我希望做的是一旦聲音恢復爲原始圖像已經停止播放。聲音停止播放後,在android/Java中替換圖像

我的按鈕,點擊收聽:

public void onClick(View v) { 
     // Perform action on click 
     Context context = getApplicationContext(); 
     CharSequence text = "Playing Theme"; 
     int duration = Toast.LENGTH_SHORT; 

      //this is the replaced image while the sound is playing 
     imgSheep.setImageResource(R.drawable.replacedimage); 

     Toast.makeText(context, text, duration).show(); 
     playSound(R.drawable.sound); 
    } 

我的聲音播放功能:

//plays a sound file 
private void playSound(int sFile) { 
    //set up MediaPlayer 
    final int medFile = sFile; 

    Thread thread = new Thread(new Runnable() { 
     public void run() { 
      playSound = MediaPlayer.create(getApplicationContext(), medFile); 
      playSound.start(); 
     } 
    }); 
    thread.start(); 
} 

我知道我可以使用的方法,如:

mp.setOnCompletionListener(new OnCompletionListener() { 

      @Override 
      public void onCompletion(MediaPlayer mp) { 
       performOnEnd(); 
      } 

      }); 

所以我可以有它是這樣的:

playSound.setOnCompletionListener(new OnCompletionListener() { 
       @Override 
       public void onCompletion(MediaPlayer playSound) { 
         imgSheep.setImageResource(R.drawable.originalimage); 
       } 
    }); 
+1

它看起來像你一般知道如何做到這一點。那麼你有什麼問題? –

+0

我在onCreate實例中添加並運行該應用程序給我一個FC錯誤... – Si8

+0

從日誌和您的onCreate的代碼發佈堆棧跟蹤。 –

回答

2

你的問題是你的線程。在playSound中,您將開始創建媒體播放器並播放聲音的新線程。但是,您正在onCreate中設置onCompletionListener。這裏有一個競爭條件 - 如果新線程不是日程安排,並且在您點擊該行之前未運行並設置mediaPlayer變量,則會因NullPointerError而崩潰。

我建議只是失去了線程。 MediaPlayer已經可以在後臺播放,不會掛起UI線程。