Android 无法销毁活动非法状态异常
我已经在安卓系统中创建了一个媒体播放器,其中媒体播放器在服务上。 我的主要活动有一个选项菜单,其中只有一个选项“exit”onOptions ItemSelected调用另一个方法(mp是MediaPlayer的实例) 而无损检测方法简单Android 无法销毁活动非法状态异常,android,android-service,android-mediaplayer,illegalstateexception,ondestroy,Android,Android Service,Android Mediaplayer,Illegalstateexception,Ondestroy,我已经在安卓系统中创建了一个媒体播放器,其中媒体播放器在服务上。 我的主要活动有一个选项菜单,其中只有一个选项“exit”onOptions ItemSelected调用另一个方法(mp是MediaPlayer的实例) 而无损检测方法简单 protected void onDestroy() { super.onDestroy(); if (!PlayerService.mp.isPlaying()) { stopService(playe
protected void onDestroy() {
super.onDestroy();
if (!PlayerService.mp.isPlaying()) {
stopService(playerService);
cancelNotification();
finish();
}
}
但它会抛出
java.lang.RuntimeException:无法销毁活动
java.lang.IllegalStateException
有人能帮我吗?谢谢哦,别犯这么愚蠢的错误,finish()它会再次自行调用onDestroy(),所以我不得不简单地将代码更改为:
private void exitPlayer() {
if(PlayerService.mp.isPlaying())
PlayerService.mp.stop();
finish();
}
protected void onDestroy() {
super.onDestroy();
if (!PlayerService.mp.isPlaying()) {
stopService(playerService);
cancelNotification();
}
}
不要调用onDestroy(),请尝试以下操作:
private void exitPlayer() {
PlayerService.mp.stop();
exitAll();
}
private void exitAll() {
if (!PlayerService.mp.isPlaying()) {
stopService(playerService);
cancelNotification();
finish();
}
finish()将销毁该活动。但是您不能确定onDestroy()是否会被调用!在内存不足的情况下,系统可以随时销毁活动,并且不会调用onDestroy()
最后一个肯定会被调用的回调是onPause()。因此,为了安全起见,请将代码移出onDestroy() 这不是一个完美的方法,但即使这不是一个好的做法,
非法状态例外
也可以通过这种方法避免。(使用上面Steve提供的解决方案)
因为至少调用了ondestory()
。(如图所示:)
此时您的活动几乎完成或正在完成。通过finish()
因此,要在没有非法状态异常的情况下使用onDestroy()
方法,您必须这样做:
protected void onDestroy() {
if (!PlayerService.mp.isPlaying()) {
stopService(playerService);
cancelNotification();
//finish();
}
super.onDestroy();
}
你永远不会直接调用onDestroy(),它非常重要,非法状态异常通常包含更多的信息,准确地告诉你发生了什么。日志的其他部分怎么说?这可能会帮助您:@tyczj mp.stop()正在停止mediaplayer!A为什么不直接给onDestroy打电话?如果我暂停“活动”中的音乐并按“后退”按钮退出,则会毫无例外地调用“活动”onDestroy(),我想这也是同样的硬代码。我还需要onDestroy()中的3行exitAll(),因为我不希望用户按“后退”按钮以任何方式停止音乐,谢谢我没有想到内存不足的情况,很好的提示
protected void onDestroy() {
if (!PlayerService.mp.isPlaying()) {
stopService(playerService);
cancelNotification();
//finish();
}
super.onDestroy();
}