只有在播放时才需要if语句来停止MediaPlayer对象

时间:2014-05-05 01:33:51

标签: android timer android-mediaplayer

我创建了一个计时器,所以当它结束时,音乐会播放。但是如果用户按下后退按钮,则该歌曲不会停止播放。所以我试图覆盖有效的生命周期方法onPause(),所以如果计时器已经完成并且音乐实际正在播放 - 那么使用后退按钮就会停止音乐。

但是,当用户尝试按>设备的后退按钮时,计时器结束(并且音乐尚未开始),那么我在null pointer exception中获得onPause() {1}}方法。

导致这种情况的原因是什么?我如何编写说"如果MediaPlayer 播放的代码,然后停止并释放它,否则什么都不做"。这就是我在概念上需要的东西。 (或者可能有更好的方法来编写它?)

以下是计时器onFinishes()方法中MediaPlayer的代码段,当计时器结束时,该歌曲开始播放。mpCease只是一个代表mp的全局变量,因此我可以在onFinish()之外使用它。

public void onFinish() {
                mTextField.setText("BRAINS!!");
                // call some media function here
                MediaPlayer mp = MediaPlayer.create(ZombieThemedActivity.this, R.raw.zombie_sound);
                mp.start();
                mpCease = mp;

                // This disables the pause/play button when timer ends
                Button disablePausePlay = (Button)findViewById(R.id.btnPause);
                disablePausePlay.setEnabled(false);
        }

这是迄今为止写的onPause方法(它还没有完成),当按下后退按钮时(仅当它已经播放时)才能很好地停止音乐。

@Override
    protected void onPause(){
            super.onPause();
        if (mpCease.isPlaying()) {
            mpCease.stop();
            mpCease.release();
        } else if (!mpCease.isPlaying()) {
            // it should do nothing to mpCease or to anything else
        }
    }

LogCat (在计时器完成之前按下后退按钮时,它会崩溃)。

FATAL EXCEPTION: main
    java.lang.RuntimeException: Unable to pause activity {com.azurespot.disastertimer.app/com.azurespot.disastertimer.app.themedactivities.ZombieThemedActivity}: java.lang.NullPointerException
            at android.app.ActivityThread.performPauseActivity(ActivityThread.java:2838)
            at android.app.ActivityThread.performPauseActivity(ActivityThread.java:2794)
            at android.app.ActivityThread.handlePauseActivity(ActivityThread.java:2772)
            at android.app.ActivityThread.access$800(ActivityThread.java:130)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1212)
            at android.os.Handler.dispatchMessage(Handler.java:99)
            at android.os.Looper.loop(Looper.java:137)
            at android.app.ActivityThread.main(ActivityThread.java:4745)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:511)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
            at dalvik.system.NativeStart.main(Native Method)
     Caused by: java.lang.NullPointerException
            at com.azurespot.disastertimer.app.themedactivities.ZombieThemedActivity.onPause(ZombieThemedActivity.java:157)
            at android.app.Activity.performPause(Activity.java:5106)
            at android.app.Instrumentation.callActivityOnPause(Instrumentation.java:1225)
            at android.app.ActivityThread.performPauseActivity(ActivityThread.java:2825)
            at android.app.ActivityThread.performPauseActivity(ActivityThread.java:2794)
            at android.app.ActivityThread.handlePauseActivity(ActivityThread.java:2772)
            at android.app.ActivityThread.access$800(ActivityThread.java:130)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1212)
            at android.os.Handler.dispatchMessage(Handler.java:99)
            at android.os.Looper.loop(Looper.java:137)
            at android.app.ActivityThread.main(ActivityThread.java:4745)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:511)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
            at dalvik.system.NativeStart.main(Native Method)

1 个答案:

答案 0 :(得分:3)

删除mp并将其替换为mpCease。然后检查是null

@Override
protected void onPause(){
        super.onPause();
    if (mpCease != null) //add a null check here
    {
        if (mpCease.isPlaying()) { 
            mpCease.stop();
            mpCease.release();
        // if this does nothing then the else isn't needed
        } else {
            // it should do nothing to mpCease or to anything else
        }
    }

您甚至不必摆脱mp,只需检查mpCease是否为null。在(我假设)onFinish()的{​​{1}}之前,您不会对其进行初始化。所以,如果他们在完成之前按回来,那么显然它是CountDownTimer