在其 "OnCompletionListener()" 内的 Music 对象上使用 "dispose()"?
Using "dispose()" on a Music object inside its "OnCompletionListener()"?
在歌曲结束时拥有一个自身的 Music 对象 dispose()
似乎是个好主意。只需在 Music 对象的 OnCompletionListener()
中调用 individual_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." );
}
}
上面的代码始终将 Music 对象 musicMoment
显示为非空。该软件可能 运行 几秒钟,即使“blank.ogg”持续不到一秒钟,这似乎每次都是如此。在侦听器外部调用 dispose()
工作正常,因此 'musicMoment' 显示为 null。
如果 dispose()
在听众中不起作用,我如何在歌曲结束时正确处理歌曲?
dispose()
不会清除任何对象的引用。如果您没有任何可能在垃圾收集器 运行.
时从堆内存中清除的对象的引用
根据文档,Images and sound effects
等重资源由本机驱动程序而不是 Java 垃圾收集器管理。
当您的资源不再需要时,需要手动处置这些资源。所有这些资源都实现了一个通用接口 Disposable。
资源释放失败会导致严重的内存泄露!
资源在不再需要时应立即处理掉,释放与其关联的内存。访问已处置的资源将导致未定义的错误,因此请确保 clear out all references you have to a disposed resource
.
在歌曲结束时拥有一个自身的 Music 对象 dispose()
似乎是个好主意。只需在 Music 对象的 OnCompletionListener()
中调用 individual_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." );
}
}
上面的代码始终将 Music 对象 musicMoment
显示为非空。该软件可能 运行 几秒钟,即使“blank.ogg”持续不到一秒钟,这似乎每次都是如此。在侦听器外部调用 dispose()
工作正常,因此 'musicMoment' 显示为 null。
如果 dispose()
在听众中不起作用,我如何在歌曲结束时正确处理歌曲?
dispose()
不会清除任何对象的引用。如果您没有任何可能在垃圾收集器 运行.
根据文档,Images and sound effects
等重资源由本机驱动程序而不是 Java 垃圾收集器管理。
当您的资源不再需要时,需要手动处置这些资源。所有这些资源都实现了一个通用接口 Disposable。
资源释放失败会导致严重的内存泄露!
资源在不再需要时应立即处理掉,释放与其关联的内存。访问已处置的资源将导致未定义的错误,因此请确保 clear out all references you have to a disposed resource
.