我创建了一个计时器,这样当它结束时,音乐就会播放。但是如果用户按下后退按钮,歌曲不会停止播放。因此,我尝试覆盖生命周期方法onPause()
,该方法有效,因此,如果计时器已完成且音乐正在播放,则使用“后退”按钮停止音乐。
但是,当用户试图在计时器结束之前按下设备的后退按钮(音乐尚未开始)时,我会在onPause()
方法中得到一个null指针异常。
这是什么原因造成的?如何编写这样的代码:“如果MediaPlayer正在播放,那么停止并释放它,否则什么也不做”。这就是我在概念上需要的。(或者有更好的方法来写呢?)
这是我在计时器的
onFinish()
方法中的MediaPlayer的代码片段,当计时器完成时,它会使歌曲开始播放。(mpCise
只是一个全局变量,表示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)
只需去掉mp
,用mpstop
替换即可。然后检查它是否为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
,只需检查mpstop
是否为null
。直到(我假设)一个倒计时
的onFinish()
,你才初始化它。所以,如果他们在它完成之前按back,那么显然它是null
。
我创建的Android应用程序包含2个按钮,点击每个按钮播放mp3文件。问题是,当我播放按钮1时,它播放声音1,当我单击按钮2时,它播放声音2。 我检查其他玩家的每个按钮是否正常工作,然后停止并播放单击的按钮 但是,如果我两次单击同一个按钮,则会将第一个音频保持在后台播放,然后再次播放另一个音频 我试图检查并停止它,但它不起作用! 我想,如果我点击按钮1,它将播放声音,如果再次点击它,它将停止播放
我正在android上开发一个音乐播放器,该应用程序有两个活动(MainActivity和PlayActivity)。在Main活动中,我有一个包含歌曲列表的列表视图,在PlayActivity中,我有一个按钮来收听和暂停音乐。问题是,当我返回MainActivity并从listview中选择一首新歌时,第一首歌会继续在后台播放,而第二首歌也会开始播放。选择新歌曲时,如何停止第一首歌曲?(我不想让
我有一个ListView,里面有一些项目,每个项目都播放一定的声音。这是代码: 如果我点击一个项目,它开始播放,然后在我之前点击的项目完成播放之前点击另一个项目,MediaPlayer只会同时播放两种声音。如果我在MediaPlayer停止()播放以前的声音并开始播放新的声音,那么在它停止播放之前我已经单击了该项目? 我尝试在try之前添加player.stop(),这样每次单击一个项目时,Med
我有一个按钮,我想用这个按钮控制多个MediaPlayer对象。在示例中,用户从列表中选择了3个声音,当他们正在播放时,用户点击暂停图标按钮,所有声音都应该暂停(并且暂停按钮的资源应该更改为播放图标)。如果用户再次点击播放图标,所有的声音应该继续。 如果我删除代码中的其他部分,我可以实现暂停声音,这是当前正在播放,但如果我再次单击播放按钮,声音将不会播放,什么也不会发生。 我得XML: 我的代码:
当我运行它时,我得到一个x一段时间后的错误。我知道我犯了这个错误,因为它在这一页的末尾。如何在没有收到此错误的情况下停止程序? 我试过了 或 我的代码是: 打印(newsContents.text)属性错误:“非类型”对象没有属性“文本”
我有一个函数来获取服务长度,我需要执行一个if语句来检查空日期,我是否能够使用术语if@dateleftorg=='1900-01-01 00:00:00.000'我需要做的是,如果@dateleftorg为空,则使用GETDATE(),否则我使用@dateleftorg中的值