谷歌游戏服务泄漏问题

17
我之前开始使用Google Play游戏服务,昨天在查看日志时,我注意到了以下错误信息:

E/DataBuffer(3183): 检测到DataBuffer对象内部的数据泄漏!确保在完成使用DataBuffer扩展对象后明确调用close()方法。(内部对象:com.google.android.gms.common.data.DataHolder@40555410)

该错误信息连续出现多次。我不确定它为什么会出现。它既不使我的应用崩溃,也不影响谷歌成就/排行榜功能的正常运作。
我只知道这与“unlockAchievementImmediate”和“submitScoreImmediate”函数有关。
有人遇到过这个问题或有什么建议吗?

编辑: 在我的应用中,我只使用“unlockAchievementImmediate”和“submitScoreImmediate”函数。这些函数不返回需要关闭的任何缓冲区。

当我使用AppStateClient的onStateLoadedListener时,这也会发生(这很有趣,因为甚至没有返回Buffer对象,所以不确定Google希望我如何关闭它!) - user2346305
2个回答

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()的情况下退出该应用程序,则可以期望在再次打开该应用程序时看到三次警告。加上buff.close(),它们就会消失。完成!


虽然上述内容仍然正确,但我仍然发现我有一个流浪的程序出现在某个地方,我无法用任何未关闭的缓冲区来解释它...似乎只需登录、退出和重新打开就足以引起这种情况。也许我们正在实现的JAR文件是导致这种情况的原因。 - CodeMonkey
这可能适用于多人游戏/回合比赛功能,但在我的应用程序中,我仅使用“unlockAchievementImmediate”和“submitScoreImmediate”,它们不返回任何缓冲区。 - cavpollo

1
任何数据缓冲的子类都需要释放。因此,在使用完该对象后,请释放它。
数据缓冲对象包含一个release()方法,因此在使用完该对象后,只需使用databuffer.release();进行释放即可。

在我开发这个应用程序的时候(我不知道现在是否有任何变化),我只使用了“unlockAchievementImmediate”和“submitScoreImmediate”方法。这些函数没有返回任何缓冲区,因此没有任何可以释放的东西。 - cavpollo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接