Java 使用;dispose();在其内部的音乐对象上;OnCompletionListener();?
当音乐对象的歌曲结束时,让它自己拥有一个音乐对象Java 使用;dispose();在其内部的音乐对象上;OnCompletionListener();?,java,audio,libgdx,dispose,Java,Audio,Libgdx,Dispose,当音乐对象的歌曲结束时,让它自己拥有一个音乐对象dispose()似乎是个好主意。只需在音乐对象的OnCompletionListener()中调用individual\u Music.dispose(),对吗?嗯,这并没有起到很好的作用 我在文件前面声明以下内容: private Music musicMoment = Gdx.audio.newMusic( Gdx.files.internal( "music/blank.ogg" ) ); 以下方法设置侦听器: void music_Se
dispose()
似乎是个好主意。只需在音乐对象的OnCompletionListener()
中调用individual\u Music.dispose()
,对吗?嗯,这并没有起到很好的作用
我在文件前面声明以下内容:
private Music musicMoment = Gdx.audio.newMusic( Gdx.files.internal( "music/blank.ogg" ) );
以下方法设置侦听器:
void music_Setup_for_One_File() {
musicMoment.setVolume( 0.6f );
musicMoment.setOnCompletionListener( new Music.OnCompletionListener() {
@Override
public void onCompletion( Music musicTest ) {
musicMoment.dispose();
musicTest.dispose();
System.out.println( "TEST test Moo!!!!");
}
});
}
我使用以下方法查看节目结束时musicMoment
是否为空:
final void dispose_of_Single_Music_Song_Before_It_Finishes() {
boolean test = false;
if ( musicMoment != null ) {
musicMoment.dispose();
System.out.println( "'musicMoment' song disposed of from memory." );
} else {
System.out.println( "There is no need to clear 'musicMoment'. It is already null." );
}
}
上面的代码始终将音乐对象musicMoment
显示为非空。该软件可能会运行几秒钟,即使“blank.ogg”持续不到一秒钟,但每次似乎都是如此。在侦听器外部调用dispose()
可以正常工作,因此“musicMoment”随后显示为空
如果dispose()
在监听器中不起作用,如何在歌曲结束时正确处理歌曲?dispose()
不会清除任何对象的引用。如果您没有在垃圾收集器运行时从堆内存中清除的任何对象的引用
据doc称,像图像和音效这样的大量资源由本机驱动程序而不是Java垃圾收集器管理
当您的资源不再需要时,需要手动处置这些资源。所有这些资源都实现了一个公共接口
处置资源失败将导致严重的内存泄漏强>
一旦不再需要资源,就应该立即对其进行处置,释放与资源相关的内存。访问已处置的资源将导致未定义的错误,因此请确保清除对已处置资源的所有引用
为什么您认为对其调用dispose()
会将其设置为null
?@David我检查了您的逻辑,但似乎没有。我在想null
如何与标准Java中的垃圾收集相关。因此,如果null
不表示LibGDX中成功的dispose()
,我应该检查什么?我认为没有任何东西需要检查(或可以检查),至少从阅读中可以看出。(我想你可以再试一次,看看它(大概)会给你一些错误。)@David好的,谢谢你的洞察力。即使在play()
之前调用了dispose()
,它仍然可以播放。因此,在将变量更改为其他音乐对象之前,是否可以对音乐对象执行dispose()
操作?我的知识不会有其他引用。当不再需要时,首先使用dispose()
处理分配给他的资源(vram数据),然后将引用分配给null
,以便垃圾收集器可以使用。我使用播放列表,因此Music
变量大约每2到3分钟更改一次引用。我假设这与将其设置为null
具有相同的效果?