Утечка служб 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();
.