Android 在创建多人游戏的新房间时,随机获取错误代码状态\网络\错误\无\数据

Android 在创建多人游戏的新房间时,随机获取错误代码状态\网络\错误\无\数据,android,real-time,google-play-games,multiplayer,Android,Real Time,Google Play Games,Multiplayer,我正在开发一个实时多人游戏。游戏本身运行良好。我正在努力解决随机发生的房间创建错误。我使用google play games作为框架。游戏理念是在一个单人房间内管理3到7名玩家。在构建一个游戏的10次尝试中,错误发生大约2次。我在方法public void onRoomCreated(int statusCode,roomroom){…}处收到错误。发生错误时,参与者无法创建房间。但是,如果我选中participant.isConnected(),它将返回true 这是收到的错误代码: Erro

我正在开发一个实时多人游戏。游戏本身运行良好。我正在努力解决随机发生的房间创建错误。我使用google play games作为框架。游戏理念是在一个单人房间内管理3到7名玩家。在构建一个游戏的10次尝试中,错误发生大约2次。我在方法
public void onRoomCreated(int statusCode,roomroom){…}
处收到错误。发生错误时,参与者无法创建房间。但是,如果我选中participant.isConnected(),它将返回true

这是收到的错误代码:

Error: onRoomCreated, status 4 
根据开发者文档,我发现了其含义:

公共静态最终整数状态\u网络\u错误\u无\u数据

尝试检索新数据时发生网络错误,并且 本地没有可用的数据

定值:4

如果我尝试在错误发生后重新启动游戏,问题仍然存在。即使我试了100次。如果我离开房间等待2分钟,新的连接尝试总是成功的

我注意到以下警告始终存在:

02-10 18:26:19.421: W/libjingle(1933): Warning(openssladapter.cc:388): ContinueSSL -- error -1
02-10 18:26:19.421: W/libjingle(1933): Warning(openssladapter.cc:397): OpenSSLAdapter::Error(ContinueSSL, -1)
我没有找到任何与此警告相关的资源。有人知道这个警告是什么意思吗

我还发现:

  • 我刚启动设备时也会发生这种情况
  • 每个游戏一次只能影响一个或多个设备
  • 不管我是在模拟器上玩还是在真实设备上玩
  • 无论我玩的是自动游戏还是邀请游戏
  • 如果我同时运行多个模拟器(游戏开始),它只能影响一个模拟器(即使它们具有相同的网络连接)
这是stacktrace(错误发生在中心线附近):

另一个具有相同错误的示例:

    02-10 18:37:15.200: E/SocketStream(130): readFully was waiting for 412296 bytes, got 16192 
02-10 18:37:15.200: E/SocketStream(130): readFully was waiting for 396104 bytes, got 16192 
02-10 18:37:15.204: E/SocketStream(130): readFully was waiting for 379912 bytes, got 16192 
02-10 18:37:15.216: E/SocketStream(130): readFully was waiting for 363720 bytes, got 16192 
02-10 18:37:15.216: E/SocketStream(130): readFully was waiting for 347528 bytes, got 16192 
02-10 18:37:15.220: E/SocketStream(130): readFully was waiting for 331336 bytes, got 16192 
02-10 18:37:15.228: E/SocketStream(130): readFully was waiting for 315144 bytes, got 16192 
02-10 18:37:15.232: E/SocketStream(130): readFully was waiting for 298952 bytes, got 16192 
02-10 18:37:15.232: E/SocketStream(130): readFully was waiting for 282760 bytes, got 16192 
02-10 18:37:15.244: E/SocketStream(130): readFully was waiting for 266568 bytes, got 16192 
02-10 18:37:15.244: E/SocketStream(130): readFully was waiting for 250376 bytes, got 16192 
02-10 18:37:15.244: E/SocketStream(130): readFully was waiting for 234184 bytes, got 16192 
02-10 18:37:15.248: E/SocketStream(130): readFully was waiting for 217992 bytes, got 16192 
02-10 18:37:15.252: E/SocketStream(130): readFully was waiting for 201800 bytes, got 16192 
02-10 18:37:15.256: E/SocketStream(130): readFully was waiting for 185608 bytes, got 16192 
02-10 18:37:15.256: E/SocketStream(130): readFully was waiting for 169416 bytes, got 15540 
02-10 18:37:15.276: E/SocketStream(130): readFully was waiting for 153876 bytes, got 16192 
02-10 18:37:15.276: E/SocketStream(130): readFully was waiting for 137684 bytes, got 16192 
02-10 18:37:15.280: E/SocketStream(130): readFully was waiting for 121492 bytes, got 16192 
02-10 18:37:15.284: E/SocketStream(130): readFully was waiting for 105300 bytes, got 16192 
02-10 18:37:15.292: E/SocketStream(130): readFully was waiting for 89108 bytes, got 16192 
02-10 18:37:15.296: E/SocketStream(130): readFully was waiting for 72916 bytes, got 16192 
02-10 18:37:15.300: E/SocketStream(130): readFully was waiting for 56724 bytes, got 16192 
02-10 18:37:15.308: E/SocketStream(130): readFully was waiting for 40532 bytes, got 16192 
02-10 18:37:15.312: E/SocketStream(130): readFully was waiting for 24340 bytes, got 16192 
02-10 18:37:15.368: D/ButtonClicker2000(3540): Select players UI succeeded.
02-10 18:37:15.368: D/ButtonClicker2000(3540): Invitee count: 1
02-10 18:37:15.368: D/ButtonClicker2000(3540): Automatch criteria: Bundle[{max_automatch_players=5, min_automatch_players=2, exclusive_bit_mask=0}]
02-10 18:37:15.368: D/ButtonClicker2000(3540): Creating room...
02-10 18:37:15.392: D/ButtonClicker2000(3540): Room created, waiting for it to be ready...
02-10 18:37:15.460: I/Ads(3540): Ad is not visible. Not refreshing ad.
02-10 18:37:15.460: I/Ads(3540): Scheduling ad refresh 60000 milliseconds from now.
02-10 18:37:15.484: V/GLSActivity(531): AuthDelegateWrapperCreated with selected intent: Intent { cmp=com.google.android.gms/.auth.DefaultAuthDelegateService }
02-10 18:37:15.504: I/qtaguid(285): Failed write_ctrl(s 0 10035) res=-1 errno=1
02-10 18:37:15.504: W/NetworkManagementSocketTagger(285): setKernelCountSet(10035, 0) failed with errno -1
02-10 18:37:15.516: V/GLSActivity(531): AuthDelegateWrapperCreated with selected intent: Intent { cmp=com.google.android.gms/.auth.DefaultAuthDelegateService }
02-10 18:37:15.544: D/OpenGLRenderer(3368): TextureCache::flush: target size: 2399280
02-10 18:37:15.544: D/OpenGLRenderer(3368): TextureCache::callback: name, removed size, mSize = 12932, 51984, 3946816
02-10 18:37:15.544: D/OpenGLRenderer(3368): TextureCache::callback: name, removed size, mSize = 12933, 51984, 3894832
02-10 18:37:15.544: D/OpenGLRenderer(3368): TextureCache::callback: name, removed size, mSize = 12926, 5184, 3889648
02-10 18:37:15.544: D/OpenGLRenderer(3368): TextureCache::callback: name, removed size, mSize = 12927, 9216, 3880432
02-10 18:37:15.548: D/OpenGLRenderer(3368): TextureCache::callback: name, removed size, mSize = 12928, 5184, 3875248
02-10 18:37:15.548: D/OpenGLRenderer(3368): TextureCache::callback: name, removed size, mSize = 13024, 36864, 3838384
02-10 18:37:15.548: D/OpenGLRenderer(3368): TextureCache::callback: name, removed size, mSize = 13023, 2304, 3836080
02-10 18:37:15.548: D/OpenGLRenderer(3368): TextureCache::callback: name, removed size, mSize = 13028, 36864, 3799216
02-10 18:37:15.552: D/OpenGLRenderer(3368): TextureCache::callback: name, removed size, mSize = 12993, 1048576, 2750640
02-10 18:37:15.552: D/OpenGLRenderer(3368): TextureCache::callback: name, removed size, mSize = 12994, 1048576, 1702064
02-10 18:37:15.628: D/ChimeraCfgMgr(700): Loading module com.google.android.gms.games from APK com.google.android.play.games
02-10 18:37:15.628: D/ChimeraModuleLdr(700): Module APK com.google.android.play.games already loaded
02-10 18:37:16.356: D/dalvikvm(531): GC_CONCURRENT freed 871K, 14% free 10526K/12103K, paused 13ms+4ms, total 43ms
02-10 18:37:16.456: I/libjingle(1912): Token type:OAuth2
02-10 18:37:16.456: I/libjingle(1912): Final XMPP server hostname talk.google.com port to 5222
02-10 18:37:16.552: I/libjingle(1912): OpenSSLAdapter::OnConnectEvent
02-10 18:37:16.604: I/libjingle(1912): BeginSSL: talk.google.com
02-10 18:37:16.636: W/libjingle(1912): Warning(openssladapter.cc:388): ContinueSSL -- error -1
02-10 18:37:16.636: W/libjingle(1912): Warning(openssladapter.cc:397): OpenSSLAdapter::Error(ContinueSSL, -1)
02-10 18:37:16.664: I/libjingle(1912): SSL Cleanup
02-10 18:37:16.676: I/libjingle(1912): Token type:OAuth2
02-10 18:37:16.676: I/libjingle(1912): Final XMPP server hostname talk.google.com port to 5222
02-10 18:37:16.720: I/libjingle(1912): OpenSSLAdapter::OnConnectEvent
02-10 18:37:16.768: I/libjingle(1912): BeginSSL: talk.google.com
02-10 18:37:16.800: W/libjingle(1912): Warning(openssladapter.cc:388): ContinueSSL -- error -1
02-10 18:37:16.800: W/libjingle(1912): Warning(openssladapter.cc:397): OpenSSLAdapter::Error(ContinueSSL, -1)
02-10 18:37:16.808: D/ButtonClicker2000(3540): onRoomCreated(4, null)
02-10 18:37:16.808: E/ButtonClicker2000(3540): debug Error: onRoomCreated, status 4
02-10 18:37:16.808: I/System.out(3540): debug apiclient connect:true, isConnecting():false
02-10 18:37:16.808: I/System.out(3540): debug dump output:
02-10 18:37:16.808: I/System.out(3540): debug dump mState=CONNECTED mResuming=false mWorkQueue.size()=0 mUnconsumedRunners.size()=0
02-10 18:37:16.808: I/System.out(3540): debug dump Plus.API:
02-10 18:37:16.808: I/System.out(3540): debug dump   mConnectState=CONNECTED mService=com.google.android.gms.plus.internal.IPlusService@539e0a94
02-10 18:37:16.808: I/System.out(3540): debug dump Games.API:
02-10 18:37:16.808: I/System.out(3540): debug dump   mConnectState=CONNECTED mService=com.google.android.gms.games.internal.IGamesService@539e1244
02-10 18:37:16.824: D/ChimeraCfgMgr(700): Loading module com.google.android.gms.games from APK com.google.android.play.games
02-10 18:37:16.824: D/ChimeraModuleLdr(700): Module APK com.google.android.play.games already loaded
02-10 18:37:16.844: I/libjingle(1912): SSL Cleanup
02-10 18:37:16.940: W/EGL_genymotion(3540): eglSurfaceAttrib not implemented
通过这种方式,我构建了一个游戏:

@Override
public void onConnected(Bundle connectionHint) {
    Log.d(TAG, "debug onConnected() called. Sign in successful!");
    Log.d(TAG, "debug Sign-in succeeded.");
    final int MAX_OPPONENTS = 6;
    int min_opponents = 2;
    int opponentsPref = getIntent().getIntExtra(MyIds.MP_MIN_OPPONENTS, MyIds.MP_MIN_OPPONENTS_TWO);
    if(opponentsPref == MyIds.MP_MIN_OPPONENTS_SIX){
        min_opponents = 6;
    }
    Bundle autoMatchCriteria = RoomConfig.createAutoMatchCriteria(min_opponents, MAX_OPPONENTS, 0);
    RoomConfig.Builder rtmConfigBuilder = RoomConfig.builder(this);
    rtmConfigBuilder.setMessageReceivedListener(this);
    rtmConfigBuilder.setRoomStatusUpdateListener(this);
    rtmConfigBuilder.setAutoMatchCriteria(autoMatchCriteria);
    rtmConfigBuilder.setVariant(variant);
    switchToScreen(R.id.mpGamescreen_wait);
    keepScreenOn();
    Games.RealTimeMultiplayer.create(mGoogleApiClient, rtmConfigBuilder.build());
}
这就是我离开房间的方式:

private synchronized void leaveRoom() {
    Log.d(TAG, "debug Leaving room.");
    switchToScreen(R.id.mpGamescreen_wait);
    if (mRoomId != null && mGoogleApiClient != null && mGoogleApiClient.isConnected()) {
        Games.RealTimeMultiplayer.leave(mGoogleApiClient, this, mRoomId);
        mRoomId = null;
        stopKeepingScreenOn();
        Log.d(TAG, "debug leave() called.");
    } else {
        Log.d(TAG, "debug leave() not called.");
        stopKeepingScreenOn();
        if (!isFinishing()){
            finish();               
        }
    }
}

@Override
public void onLeftRoom(int statusCode, String roomId) {
    // we have left the room; return to main screen.
    Log.d(TAG, "onLeftRoom, code " + statusCode);
    if (!isFinishing()){
        finish();               
    }
}

@Override
public void onDestroy(){
    if (mRoomId != null && mGoogleApiClient != null && mGoogleApiClient.isConnected()) {
        leaveRoom();
    }
    super.onDestroy();
}

// Handle back key to make sure we cleanly leave a game if we are in the middle of one
@Override
public boolean onKeyDown(int keyCode, KeyEvent e) {
    Log.d(TAG, "debug onKeyDown");
    if (keyCode == KeyEvent.KEYCODE_BACK) {
        leaveRoom();
        return true;
    }
    return super.onKeyDown(keyCode, e);
}
有人知道错误发生的原因吗?我感谢你的每一个建议

private synchronized void leaveRoom() {
    Log.d(TAG, "debug Leaving room.");
    switchToScreen(R.id.mpGamescreen_wait);
    if (mRoomId != null && mGoogleApiClient != null && mGoogleApiClient.isConnected()) {
        Games.RealTimeMultiplayer.leave(mGoogleApiClient, this, mRoomId);
        mRoomId = null;
        stopKeepingScreenOn();
        Log.d(TAG, "debug leave() called.");
    } else {
        Log.d(TAG, "debug leave() not called.");
        stopKeepingScreenOn();
        if (!isFinishing()){
            finish();               
        }
    }
}

@Override
public void onLeftRoom(int statusCode, String roomId) {
    // we have left the room; return to main screen.
    Log.d(TAG, "onLeftRoom, code " + statusCode);
    if (!isFinishing()){
        finish();               
    }
}

@Override
public void onDestroy(){
    if (mRoomId != null && mGoogleApiClient != null && mGoogleApiClient.isConnected()) {
        leaveRoom();
    }
    super.onDestroy();
}

// Handle back key to make sure we cleanly leave a game if we are in the middle of one
@Override
public boolean onKeyDown(int keyCode, KeyEvent e) {
    Log.d(TAG, "debug onKeyDown");
    if (keyCode == KeyEvent.KEYCODE_BACK) {
        leaveRoom();
        return true;
    }
    return super.onKeyDown(keyCode, e);
}