我刚开始使用Google Play游戏服务,昨天在检查logcat时我无法注意到这个错误:
E / DataBuffer(3183):DataBuffer对象中的内部数据泄漏 检测!一定要在所有DataBuffer上显式调用close() 完成它们后扩展对象。 (内部对象: com.google.android.gms.common.data.DataHolder@40555410)
它连续发生几次。我不完全确定它为什么会出现。它不会使我的应用程序崩溃,也不会使谷歌成就/排行榜功能停止工作。
我所知道的是它与“unlockAchievementImmediate”和“submitScoreImmediate”功能有关。
之前是否有人遇到此问题或有任何建议?
编辑:在我的应用中,我只使用“unlockAchievementImmediate”和“submitScoreImmediate”。这些函数不返回任何需要关闭的缓冲区。
答案 0 :(得分: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(),它们就会消失。瞧!
答案 1 :(得分:1)
需要释放任何数据缓冲区的子类。所以在完成该对象之后就释放它。
Data Buffer对象包含<?php
public static function helper($name)
{
$registryKey = '_helper/' . $name;
if (!self::registry($registryKey)) {
$helperClass = self::getConfig()->getHelperClassName($name);
self::register($registryKey, new $helperClass);
}
return self::registry($registryKey);
}
?>
方法,因此在您完成该对象后,只需使用release()
释放它。