Ios 在libgdx游戏中使用MPC框架接收数据时出现错误

Ios 在libgdx游戏中使用MPC框架接收数据时出现错误,ios,libgdx,multipeer-connectivity,robovm,Ios,Libgdx,Multipeer Connectivity,Robovm,我们正在尝试使用libgdx游戏中的MPC框架在两个设备之间建立一个多eer连接 我们通常已成功完成的工作: 设备正在连接,会话正在正确建立 会话建立后,浏览器和广告商停止 做他们的事 然后我们过渡到游戏场景。在新场景中,一个设备 可以向其他人发送消息 从会话委托调用DidReceiveData方法,然后 我们为这两种设备都提供了正确的信息 在此之后,我们向libgdx发送消息以更新内容(在main中) gdx线程) 但过了一段时间,当某些设备收到数据时,它立即崩溃。有时发生在第10次收货,有时

我们正在尝试使用libgdx游戏中的MPC框架在两个设备之间建立一个多eer连接

我们通常已成功完成的工作:

  • 设备正在连接,会话正在正确建立
  • 会话建立后,浏览器和广告商停止 做他们的事
  • 然后我们过渡到游戏场景。在新场景中,一个设备 可以向其他人发送消息
  • 从会话委托调用DidReceiveData方法,然后 我们为这两种设备都提供了正确的信息
  • 在此之后,我们向libgdx发送消息以更新内容(在main中) gdx线程)
  • 但过了一段时间,当某些设备收到数据时,它立即崩溃。有时发生在第10次收货,有时发生在第200次收货之后。崩溃仅出现在接收消息的设备上。它们连接的时间长短无关紧要。崩溃出现在所有方法处理完数据后。所以我们不知道错误到底发生在哪里

    // 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是通知和队列之间的复杂交互。