Утечка служб Google Play

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

E/DataBuffer (3183): Внутренняя утечка данных в объекте DataBuffer обнаружено! Обязательно явно вызывайте close() для всех DataBuffer расширяя объекты, когда вы закончите с ними. (внутренний объект: [email protected])

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

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

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


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

Ответы

Ответ 1

Эти элементы расширяют DataBuffer: AchievementBuffer, AppStateBuffer, FilteredDataBuffer, GameBuffer, InvitationBuffer, LeaderboardBuffer, LeaderboardScoreBuffer, MetadataBuffer, MomentBuffer, УчастникBuffer, 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(), и они исчезнут. Вуаля!

Ответ 2

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

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