我有LibGDX应用程序,我在其中绘制一个Thread for Client或Server。使用Kryonet完成连接。当你的对手创造了一些消息时,就会收到消息:
public void received(Connection con, Object object) {
TroopMessage tm = (TroopMessage)object;
fortress.map.addSoldier(tm.kind, true);
System.out.println("recieved");
connection = con;
}
当调用此回调(并且它正确)时,我得到“在当前线程中找不到OpenGL上下文”。我认为它正在寻找MyClient线程中的对象堡垒。我想调用fortress.map.addSoldier,它引用当前存在于另一个线程中的对象。
public class Fortress extends Game implements ApplicationListener{
private OrthographicCamera camera;
private SpriteBatch batcher;
public static MyServer server;
public static MyClient client;
public static Map map;
[....]
如何从另一个线程调用该方法?
提前致谢
答案 0 :(得分:4)
在Libgdx中,您可以使用Gdx.app.postRunnable(Runnable r)
来询问具有渲染线程的主OpenGL上下文运行某些代码。请在此处查看有关应用程序线程的Libgdx维基:https://code.google.com/p/libgdx/wiki/ApplicationThreading
正如评论所指出的,通常Java对象不是由线程“拥有”的。 “OpenGL上下文”是一个例外,因为只允许一个线程对OpenGL状态进行更改。