在其“ OnCompletionListener()”内部的Music对象上使用“ dispose()”?

时间:2018-08-14 22:34:43

标签: java audio libgdx dispose

在歌曲结束时拥有一个Music对象dispose()似乎是个好主意。只需在音乐对象的individual_Music.dispose()中调用OnCompletionListener(),对吗?好吧,效果不是很好。

我早先在文件中声明了以下内容:

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." );

    }

}

上面的代码始终将Music对象musicMoment显示为非null。该软件可能会运行几秒钟,即使“ blank.ogg”持续不到一秒钟,每次也似乎保持这种状态。在侦听器外部调用dispose()可以正常工作,因此'musicMoment'会显示为空。

如果dispose()在听众内部无法正常播放,如何在歌曲结束时正确处理?

1 个答案:

答案 0 :(得分:1)

dispose()不会清除任何对象的引用。如果您没有引用运行垃圾收集器时可能会从堆内存中清除的任何对象的引用。

根据文档,Images and sound effects等重资源由本机驱动程序而不是Java垃圾收集器管理。

当不再需要资源时,需要手动处置这些资源。所有这些资源都实现一个公共接口Disposable

无法处理资源将导致严重的内存泄漏!。

应该在不再需要资源时将其丢弃,以释放与其关联的内存。访问已处置的资源将导致未定义的错误,因此请确保clear out all references you have to a disposed resource