Google Play服务泄漏

时间:2014-02-11 08:28:21

标签: android memory-leaks google-play-services google-play-games

我刚开始使用Google Play游戏服务,昨天在检查logcat时我无法注意到这个错误:

  

E / DataBuffer(3183):DataBuffer对象中的内部数据泄漏   检测!一定要在所有DataBuffer上显式调用close()   完成它们后扩展对象。 (内部对象:   com.google.android.gms.common.data.DataHolder@40555410)

它连续发生几次。我不完全确定它为什么会出现。它不会使我的应用程序崩溃,也不会使谷歌成就/排行榜功能停止工作。

我所知道的是它与“unlockAchievementImmediate”和“submitScoreImmediate”功能有关。

之前是否有人遇到此问题或有任何建议?


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

2 个答案:

答案 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()释放它。