15

,我開始使用谷歌Play遊戲服務前一陣子,昨天在檢查我不能幫助注意到這個錯誤的logcat:谷歌播放服務泄漏

E/DataBuffer(3183): Internal data leak within a DataBuffer object detected! Be sure to explicitly call close() on all DataBuffer extending objects when you are done with them. (internal object: [email protected])

它連續發生幾次。我不完全確定它爲什麼會出現。它不會讓我的應用崩潰,也不會讓谷歌成就/排行榜功能停止工作。

我只知道它與「unlockAchievementImmediate」和「submitScoreImmediate」函數有關。

有沒有人遇到過這個問題或者有什麼建議?


編輯:在我的應用我只能用 「unlockAchievementImmediate」 和 「submitScoreImmediate」。這些函數不返回任何需要關閉的緩衝區。

+0

當我使用AppStateClient的onStateLoadedListener時(這很有趣,因爲沒有Buffer對象甚至被返回,所以不知道Google如何期待我關閉它)! – user2346305

回答

7

這些項目延伸的DataBuffer:AchievementBuffer,AppStateBuffer,FilteredDataBuffer,GameBuffer,InvitationBuffer,LeaderboardBuffer,LeaderboardScoreBuffer,MetadataBuffer,MomentBuffer,ParticipantBuffer,PersonBuffer,PlayerBuffer,TurnBasedMatchBuffer。

這些通常在您的聽衆那些特定項目中找到。例如:

public void onTurnBasedMatchesLoaded(int statusCode, LoadMatchesResponse response) 
{ 
    TurnBasedMatchBuffer buff = response.getMyTurnMatches(); 
    // do some stuff with buff 
    buff.close() 
} 

public void onPlayersLoaded(int statusCode, PlayerBuffer buff) 
{ 
    Player p = buff.get(0); 
    buff.close(); 
} 

直到我退出我的應用程序並重新進入後,錯誤纔會報告。如果我調用我的匹配3次並退出應用程序而不調用buff.close(),則預計在再次打開它時看到3次警告。加入buff.close()並且它們消失。瞧!

+0

儘管上述方法仍然正確,仍然會發現我有一個流氓某個地方,我無法用任何未封閉的緩衝區來解釋......似乎只需登錄,退出和重新打開就足以導致此問題。也許我們正在實施的罐子造成了這種情況。 – CodeMonkey

+0

可能是Multiplayer/TurnBasedMatches函數的情況,但在我的應用程序中,我只使用「unlockAchievementImmediate」和「submitScoreImmediate」,它不返回任何緩衝區。 – cavpollo

1

需要釋放任何子類的數據緩衝區。所以在你完成這個對象後釋放它。

數據緩衝區對象包含一個release()方法,因此在完成該對象之後,只需使用databuffer.release();將其釋放即可。

+0

當時我正在開發應用程序(從那時起我不知道是否有任何改變),我只用了「unlockAchievementImmediate」和「submitScoreImmediate」這兩個方法。這些函數沒有返回任何緩衝區,所以沒有任何可以釋放的東西。 – cavpollo