我创建了一个计时器,所以当它结束时,音乐会播放。但是如果用户按下后退按钮,则该歌曲不会停止播放。所以我试图覆盖有效的生命周期方法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)
答案 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
。