1

我在 android 中创建了一个媒体播放器,其中 MediaPlayer 位于服务上。我的主要活动有一个选项菜单,其中包含单个项目“退出”onOptionsItemSelected 调用另一个方法(mp 是服务中的 MediaPlayer 实例)

private void exitPlayer() {
        PlayerService.mp.stop();
        onDestroy();
    }

并且 onDestroy 方法很简单

protected void onDestroy() {
        super.onDestroy();
        if (!PlayerService.mp.isPlaying()) {
            stopService(playerService);
            cancelNotification();
            finish();
        }   
    }

但它抛出

java.lang.RuntimeException:无法销毁活动 java.lang.IllegalStateException

谁能帮我?谢谢

4

3 回答 3

1

而不是调用 onDestroy() 试试这个:

private void exitPlayer() {
     PlayerService.mp.stop();
     exitAll();
}

private void exitAll() {
    if (!PlayerService.mp.isPlaying()) {
        stopService(playerService);
        cancelNotification();
        finish();
}

finish() 将销毁 Activity。但是你不能确定会调用 onDestroy() !系统可以随时销毁 Activity,例如在内存不足的情况下,并且不会调用 onDestroy()。

最后一个肯定会被调用的回调是 onPause()。因此,将代码移出 onDestroy() 以确保安全。

于 2013-11-11T19:21:02.517 回答
0

哦,没有这么愚蠢的错误,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();
        }

    }
于 2013-11-11T19:16:42.617 回答
0

这不是完美的做法,但即使这不是一个好的做法,IllegalStateException也可以避免这种方式。(使用史蒂夫的上述解决方案)

因为onDestroy()至少被称为。(如图所示: 活动生命周期。

您的活动在那个时候几乎完成或即将完成。由finish().

所以要使用onDestroy()没有的方法IllegalStateException,你必须这样做:

protected void onDestroy() {
    if (!PlayerService.mp.isPlaying()) {
        stopService(playerService);
        cancelNotification();
        //finish();
    } 
    super.onDestroy();  
}
于 2015-04-02T13:38:59.817 回答