2012-09-25 38 views
10

我在當前正在使用的應用程序中使用MediaPlayer類。我想在我的Activity的生命週期中堅持MediaPlayer類的一個實例。我放開了從MediaPlayer的類中的資源;在onPause(){}活動的方法,然而,當活動開始我看到下面的警告在logcat的窗口彈出:Android:MediaPlayer未完成發佈

W/MediaPlayer-JNI(16795): MediaPlayer finalized without being released 

任何想法,我在這裏做錯了或如何刪除此警告?它似乎沒有導致任何問題,並且聲音工作得很好。

因爲我包裝了幾個對象以允許管理狀態(MediaPlayer類當前不提供狀態信息)和其他各種原因,但我的代碼非常多:

@Override 
public void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    initialiseSounds(this); 
} 

@Override 
protected void onPause() 
{ 
    soundManager.releaseResources(); 
} 

@Override 
protected void onResume() 
{ 
    initialiseSounds(this); 
} 

用此方法在我SoundManager類類:

public void releaseResources() 
{ 
    player.release(); 
} 

而在initialiseSounds我做:

MediaPlayer player = new MediaPlayer(); 
player.reset(); 
player.setAudioStreamType(AudioManager.STREAM_MUSIC); 
AssetFileDescriptor assetFileDescriptor = context.getResources().openRawResourceFd(resourceId); 
setDataSource(player, assetFileDescriptor); 

當我要播放的曲目我做的:

player.prepare(); 
player.start(); 

欣賞任何建議,

感謝,

+0

你可以在onCreate/onResume/onPause等包含你正在做的媒體播放器的相關代碼片段嗎? 「釋放資源」可能會有些含糊不清。 – Tim

+0

@Tim Hi Tim添加了一些代碼,謝謝! – magritte

回答

17

我不能完全確定該消息的來源,但這裏需要注意的您正在創建兩個 MediaPlayers:一個在onCreate中,另一個在onResume中。

該消息似乎表明它不喜歡MP沒有被「釋放」而正在最終確定(GC'd)。它可能指的是您在onCreate中創建的第一個mediaPlayer,在您將其重新分配到onResume後會丟失。

如果您只創建一個MediaPlayer而不是兩個,那麼錯誤可能會消失?

+0

啊 - 你可能是對的,我會看看那個謝謝 – magritte

+1

你打在頭上的釘子廣場!謝啦。 – magritte

1

我遇到過類似的問題在onStart()或onResume中調用方法,不要在onCreate()中調用它。

1

如果您未在媒體播放器對象上調用發佈,並且您的片段停止並銷燬,則也會出現此消息。

您需要覆蓋onStop()或媒體播放器上的其他方法之一和調用release()。

@Override 
public void onStop() { 
    super.onStop(); 
    mediaPlayer.stop(); 
    mediaPlayer.release(); 
}