此代碼適用於我測試過的設備,(所有mdpi級別的設備)。如何有效地處理媒體播放器?
private void stopSounds() {
if (mp!=null && mp.isPlaying()) {
mp.stop();
mp.reset();
mp.release();
mp = null;
}
}
private void playSounds(int sound) {
stopSounds();
mp = new MediaPlayer();
mp = MediaPlayer.create(this, sound);
mp.start();
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.button1:
playSounds(R.raw.correct_amazing);
break;
case R.id.button2:
playSounds(R.raw.correct_awesome);
break;
case R.id.button3:
playSounds(R.raw.correct_chick);
break;
default:
break;
}
}
到目前爲止沒有錯誤或異常,我認爲在完成(播放)後釋放MediaPlayer對象(mp)。
於是我就嘗試添加onCompletionListener如下,playSounds():
private void playSounds(int sound) {
stopSounds();
mp = new MediaPlayer();
mp = MediaPlayer.create(this, sound);
mp.start();
mp.setOnCompletionListener(new OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mep) {
mep.stop();
mep.reset();
mep.release();
mep = null;
}
});
}
然後,它開始嘔吐 「IllegalStateException異常」 如下,
01-22 17:51:24.150: W/dalvikvm(3081): threadid=1: thread exiting with uncaught exception (group=0x41e2e498)
01-22 17:51:24.150: E/test(3081): Exception
01-22 17:51:24.180: E/AndroidRuntime(3081): FATAL EXCEPTION: main
01-22 17:51:24.180: E/AndroidRuntime(3081): java.lang.IllegalStateException
01-22 17:51:24.180: E/AndroidRuntime(3081): at android.media.MediaPlayer.isPlaying(Native Method)
01-22 17:51:24.180: E/AndroidRuntime(3081): at com.Test.mediaplayertert.MPActivity.stopSounds(MPActivity.java:30)
01-22 17:51:24.180: E/AndroidRuntime(3081): at com.Test.mediaplayertert.MPActivity.playSounds(MPActivity.java:39)
01-22 17:51:24.180: E/AndroidRuntime(3081): at com.Test.mediaplayertert.MPActivity.onClick(MPActivity.java:61)
01-22 17:51:24.180: E/AndroidRuntime(3081): at android.view.View.performClick(View.java:4106)
01-22 17:51:24.180: E/AndroidRuntime(3081): at android.view.View$PerformClick.run(View.java:17150)
01-22 17:51:24.180: E/AndroidRuntime(3081): at android.os.Handler.handleCallback(Handler.java:615)
01-22 17:51:24.180: E/AndroidRuntime(3081): at android.os.Handler.dispatchMessage(Handler.java:92)
01-22 17:51:24.180: E/AndroidRuntime(3081): at android.os.Looper.loop(Looper.java:137)
01-22 17:51:24.180: E/AndroidRuntime(3081): at android.app.ActivityThread.main(ActivityThread.java:4793)
01-22 17:51:24.180: E/AndroidRuntime(3081): at java.lang.reflect.Method.invokeNative(Native Method)
01-22 17:51:24.180: E/AndroidRuntime(3081): at java.lang.reflect.Method.invoke(Method.java:511)
01-22 17:51:24.180: E/AndroidRuntime(3081): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:808)
01-22 17:51:24.180: E/AndroidRuntime(3081): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:575)
01-22 17:51:24.180: E/AndroidRuntime(3081): at dalvik.system.NativeStart.main(Native Method)
我的問題是,我有一些6個按鈕屏幕上,用戶只要按下它們就可以按下它們,我需要分別播放「正確」的聲音和「錯誤」的聲音。所以,它會持續按壓。
我的上述錯誤發生在mp對象通過setOnCompletionListener()被釋放後。
我想知道如何在上述條件下有效處理mediaplayer(或)如何在完成播放後釋放mediaplayer對象?
PASS-BY-VALUE是我錯過了(我認爲),並剛剛實施了上述規定的改變。需要在設備上進行測試。感謝分享上述鏈接,我們很快就會回來。 – sai
是不是你解決方案相同的onCompletion方法的問題或我失去了什麼? –
@ANUJGUPTA它幾乎是,它唯一的區別是它將_global_ MediaPlayer對象(mp,而不是mep)設置爲null – Melquiades