2012-09-25 2 views
10

Uso la classe MediaPlayer in un'app a cui sto lavorando attualmente. Voglio mantenere un'istanza della classe MediaPlayer per tutta la durata della mia attività. Sto liberando le risorse della classe MediaPlayer nel onPause() {} Il metodo dell'attività, tuttavia quando l'attività inizia vedo il seguente avviso pop-up nella finestra LogCat:Android: MediaPlayer finalizzato senza essere rilasciato

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

Qualsiasi idea di quello che sto sbagliando qui o come rimuovere questo avviso? Non sembra causare problemi e il suono funziona bene.

Ho un po 'troppo codice per postare perché ho spostato alcuni oggetti per consentire lo stato di essere gestito (la classe MediaPlayer attualmente non fornisce informazioni sullo stato), e vari altri motivi, ma il codice è più o meno:

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

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

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

Con questo metodo nella mia classe SoundManager:

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

E in initialiseSounds sto facendo:

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

Quando voglio riprodurre la traccia che faccio:

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

Apprezzare tutto il consiglio,

Grazie,

+0

È possibile includere i frammenti di codice rilevanti di ciò che si sta facendo per il mediaplayer in onCreate/onResume/onPause, ecc.? "liberare le risorse" potrebbe essere interpretato in modo un po 'ambiguo. – Tim

+0

@Tim Ciao Tim, ho aggiunto del codice alla domanda, grazie! – magritte

risposta

17

Io non sono completamente sicuro della provenienza di quel messaggio, a meno di notare qui che stai creando due MediaPlayer: uno su onCreate e uno su onResume.

Questo messaggio sembra indicare che non gli piace che un MP venga finalizzato (GC'd) senza essere "rilasciato". Potrebbe riferirsi a quel primo mediaPlayer che crei in onCreate, che viene perso dopo averlo riassegnato in onResume.

Forse l'errore andrà via se crei solo un MediaPlayer invece di due?

+0

Ah - potresti aver ragione, ti darò un'occhiata, grazie – magritte

+1

Hai centrato il quadrato dell'unghia sulla testa! Grazie uomo. – magritte

1

Ho riscontrato problemi simili Chiamare il metodo in onStart() o onResume, Non chiamarlo in onCreate().

1

Questo messaggio viene visualizzato anche se non si chiama release sull'oggetto lettore multimediale e il frammento viene arrestato e distrutto.

È necessario eseguire l'override di onStop() o uno degli altri metodi e chiamare release() sul lettore multimediale.

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