簡體   English   中英

無法銷毀活動IllegalStateException

[英]unable to destroy activity IllegalStateException

我已經在Android中創建MediaPlayer在服務上的媒體播放器。 我的主要活動有一個帶有單個項“ exit”的選項菜單,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

誰能幫我? 謝謝

而不是調用onDestroy(),請嘗試以下操作:

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

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

finish()將破壞活動。 但是您不能確定onDestroy()會被調用! 系統可以隨時銷毀Activity,例如在內存不足的情況下,並且不會調用onDestroy()。

肯定會被調用的最后一個回調是onPause()。 因此,為了安全起見,將代碼移出onDestroy()即可。

哦,沒有這么愚蠢的錯誤,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();
        }

    }

這不是一個完美的方法,但是即使這不是一個好習慣,也可以避免IllegalStateException (使用上述史蒂夫的解決方案)

因為至少要調用onDestroy() (如該圖所示: 活動生命周期。

您的活動在那時或即將完成。 通過finish()

因此,要使用不帶IllegalStateException onDestroy()方法,您將必須這樣做:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM