You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

LibGDX技术求助:Android设备删除绑定Gdx.audio.newMusic的音频文件

在LibGDX Android中删除已绑定到Music的音频文件的解决方案

这个问题我之前也碰到过,核心原因是LibGDX的Music实例会一直持有音频文件的系统句柄——哪怕你调用了stop()暂停播放,底层的文件流还是处于打开状态,文件被进程锁定,所以删除操作自然会失败。

解决步骤:先释放资源,再删除文件

你需要调用Music的dispose()方法来彻底释放它占用的系统资源(包括关闭文件流、释放文件句柄),之后再执行删除操作就可以成功了。修改后的TEST_B方法如下:

public class TEST_Android {
    public static Music M = null;

    // *** Test: Delete-file WITHOUT assignment *** //
    public void TEST_A() {
        Gdx.files.local("PurpleRain.ogg").delete(); // 正常工作
    }

    // *** Test: Delete-file AFTER assignment (Fixed Version) *** //
    public void TEST_B() {
        M = Gdx.audio.newMusic(Gdx.files.local("PurpleRain.ogg"));
        M.play();
        M.stop();
        
        // 关键:释放Music资源,解绑文件句柄
        M.dispose();
        // 标记实例为null,避免后续误操作
        M = null;
        
        // 现在可以正常删除文件了
        Gdx.files.local("PurpleRain.ogg").delete();
    }
}

额外注意事项

  • 调用dispose()之后,这个Music实例就不能再被使用了(比如不能再调用play()pause()等方法),如果后续还需要播放这个音频,必须重新调用Gdx.audio.newMusic()创建新的实例。
  • 如果你在项目中是复用同一个Music实例,一定要确保在所有使用场景都完成后再调用dispose(),或者可以考虑用引用计数的方式管理资源释放时机,避免提前释放导致报错。
  • 不止是Music,LibGDX中所有实现了Disposable接口的类(比如Texture、SpriteBatch等),都需要在不再使用时调用dispose()来释放资源,这也是LibGDX开发中避免内存泄漏和资源占用的最佳实践。

内容的提问来源于stack exchange,提问作者M.C.

火山引擎 最新活动