15

Я начал использовать Google Play Game Services некоторое время назад, и вчера во время проверки LogCat я не мог помочь заметить эту ошибку:Google Play Services Течь

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])

Это происходит несколько раз подряд. Я не совсем уверен, почему это происходит. Это не приводит к сбою моего приложения и не приводит к прекращению работы функции достижения/лидерства Google.

Все, что я знаю, это то, что оно связано с функциями «unlockAchievementImmediate» и «submitScoreImmediate».

Кто-нибудь сталкивался с этой проблемой раньше или имеет какие-либо предложения?


Edit: В моем приложении я использую только "unlockAchievementImmediate" и "submitScoreImmediate". Эти функции не возвращают никаких буферов, которые нуждаются в закрытии.

+0

Это также происходит, когда я использую onStateLoadedListener AppStateClient (который был забавным, поскольку объект 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

Любой субкласс буфера данных должен быть освобожден. Итак, после того, как вы закончите с этим выпуском объекта.

Объект Data Buffer содержит метод release(), поэтому после завершения этого объекта просто отпустите его, используя databuffer.release();.

+0

В то время, когда я разрабатывал приложение (я не знаю, изменилось ли с тех пор), я использовал только методы «unlockAchievementImmediate» и «submitScoreImmediate». Эти функции не возвращали никаких буферов, поэтому не было ничего, что могло бы быть выпущено. – cavpollo