Ios 在libgdx游戏中使用MPC框架接收数据时出现错误
我们正在尝试使用libgdx游戏中的MPC框架在两个设备之间建立一个多eer连接 我们通常已成功完成的工作:Ios 在libgdx游戏中使用MPC框架接收数据时出现错误,ios,libgdx,multipeer-connectivity,robovm,Ios,Libgdx,Multipeer Connectivity,Robovm,我们正在尝试使用libgdx游戏中的MPC框架在两个设备之间建立一个多eer连接 我们通常已成功完成的工作: 设备正在连接,会话正在正确建立 会话建立后,浏览器和广告商停止 做他们的事 然后我们过渡到游戏场景。在新场景中,一个设备 可以向其他人发送消息 从会话委托调用DidReceiveData方法,然后 我们为这两种设备都提供了正确的信息 在此之后,我们向libgdx发送消息以更新内容(在main中) gdx线程) 但过了一段时间,当某些设备收到数据时,它立即崩溃。有时发生在第10次收货,有时
// MCSession delegate method
public void didReceiveData(MCSession session, NSData data, MCPeerID peerID) {
//there we make userInfoData
//
DispatchQueue.getMainQueue().async(new Runnable() {
@Override
public void run() {
NSNotificationCenter.getDefaultCenter().postNotification(new NSString("didReceiveData"), null, userInfoData);
}
});
}
// Register observer in NSNotificationCenter
// NSNotificationCenter.getDefaultCenter().addObserver(this, Selector.register("updateDataWithNotification:"), new NSString("didReceiveData"), null);
// This method is called when device has received new data
@Method
private void updateDataWithNotification(NSNotification notification){
userInfoDict = notification.getUserInfo();
data = (NSData) userInfoDict.get(new NSString("data"));
strBytes = new String(data.getBytes());
// i'm not sure this Gdx.app.postRunnable is really needed
Gdx.app.postRunnable(new Runnable() {
@Override
public void run() {
SBGlobalMessanger.getInstance().readBluetoothMessage(BluetoothData.RC_MESSAGE, strBytes);
}
});
}
问题是:
臭虫在哪里?我们如何修复它呢?问题出在robovm插件中。在调试模式下,它使构建崩溃。发布后,构建错误消失了。在使用robovm+libgdx之后,我学到的一点是,如果您有奇怪的bug,只需进行发布构建。这种bug似乎在robovm 1.3的最新版本中被消除了(我还没有尝试过) 我没看到虫子。但是你的代码太复杂了。你为什么需要信号?通过从委托方法(在另一个队列中运行)调度到主队列,您正在做正确的事情,但是为什么不直接调用处理程序方法而不发出信号呢?无论如何,即使我直接处理数据,也会导致崩溃。使用通知的原因是解耦类。一个单例处理程序实现MCSessionDelegate、MCNearbyServiceBrowserDelegate、MCNearbyServiceAdvertiserDelegate。第二个类实现了更高抽象级别的另一个接口。这就是为什么我创建了两个类,它们使用的是观察者而不是一个大类。您可以在不使用通知的情况下解耦。我使用了另一个类Messenger,因此我的didReceiveData会这样做:dispatch_async(dispatch_get_main_queue()){Messenger.receive(data!)}。我可能错了,只是说这个bug是通知和队列之间的复杂交互。