Мы пытаемся установить многоранговое соединение между двумя устройствами, используя инфраструктуру MPC в игре libgdx.
Что в целом мы сделали успешно:
- Устройства подключаются, сессия устанавливается корректно.
- После того, как сессия установлена, NearBrowser и NearAdvertiser перестают выполнять свои функции.
- Затем делаем переход к игровой сцене. В новой сцене одно устройство может отправить сообщение другому.
- Вызывается метод DidReceiveData из Session Delegate, и мы получаем правильные сообщения для обоих устройств.
- После этого мы отправляем в libgdx сообщение для обновления контента (в основном потоке 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);
}
});
}
Вопросы: Где ошибка? И как мы можем это исправить?