我的游戏有一个统计队列,每场比赛结束后,当前游戏的统计数据都会进入队列。 每当主菜单启动时,我想将所有游戏统计数据上传到服务器,这需要 1-3 秒,我想在另一个线程中执行此操作。
我的代码
@Override
public void show() {
Global.key = Global.getKey();
// System.out.println(Stats.getJSONObject(Global.key));
Gdx.app.postRunnable(new Runnable() {
@Override
public void run() {
Stats.TryUploadGame1();
System.out.println("DONE");
}
});
.....
}
但这也卡住了我的游戏。
我该怎么办?
最佳答案
您当前的代码正在发布一个 Runnable
实例,该实例将在下一帧之前由渲染线程执行。 Gdx.app.postRunnable
API 通常用于后台线程可以请求在渲染线程上发生某些事情。您想要发布一个 Runnable
以在渲染线程以外的任何地方执行。
只要您的 Stats 代码根本不与 OpenGL 上下文交互(因为 Android OpenGL API 假定只有一个线程与它们交互),您只需在新背景上发布您的 Runnable
主题:
new Thread(new Runnable() { ... }).start();
这应该会解锁您的渲染。 (当然,如果您的后台线程使用大量 CPU,它仍然会干扰渲染线程,但如果它主要执行阻塞 IO 或主机有备用内核,则它不应该干扰。)
这可以通过多种方式进行改进(使用 ThreadPool,或使用支持 Android 的后台任务),但如果您的统计信息更新相对较快并且线程创建不频繁,那么这应该可以正常工作。
关于java - libgdx - 在其他线程中做某事不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22424109/