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
具有相同的效果?