15

Ich begann mit Google vor einer Weile Play-Spieldienste, und gestern, während der logcat Überprüfung ich Hilfe könnte nicht diesen Fehler bemerken:Google Play-Dienste Leak

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

Es mehrmals in einer Reihe auftritt. Ich bin mir nicht ganz sicher, warum es entsteht. Es bringt meine App nicht zum Absturz, und die Google-Leistung/Bestenlisten-Funktion funktioniert nicht mehr.

Alles, was ich weiß ist, dass es mit den Funktionen "unlockAchievementImmediate" und "submitScoreImmediate" verwandt ist.

Hat jemand dieses Problem vor oder hat irgendwelche Vorschläge?


Edit: In meiner app verwende ich "unlockAchievementImmediate" nur und "submitScoreImmediate". Diese Funktionen geben keine Puffer zurück, die geschlossen werden müssen.

+0

Dies geschieht auch, wenn ich den onStateLoadedListener des AppStateClient verwende (was Spaß gemacht hat, da kein Buffer-Objekt zurückgegeben wird, also nicht sicher, wie Google erwartet, dass ich es schließe!) – user2346305

Antwort

7

Diese Elemente erweitern Databuffer: AchievementBuffer, AppStateBuffer, FilteredDataBuffer, GameBuffer, InvitationBuffer, LeaderboardBuffer, LeaderboardScoreBuffer, MetadataBuffer, MomentBuffer, ParticipantBuffer, PersonBuffer, PlayerBuffer, TurnBasedMatchBuffer.

Diese sind in der Regel in Ihren Zuhörern dieser bestimmten Elemente gefunden. Zum Beispiel:

Der Fehler wird erst gemeldet, nachdem ich meine App verlassen und erneut eingeben. Wenn ich meine Matches dreimal aufrufen und die App ohne Aufruf von buff.close() verlasse, kann ich erwarten, dass die Warnung 3 Mal nach dem erneuten Öffnen angezeigt wird. Füge die Buff.close() hinzu und sie verschwinden. Voila!

+0

Während das oben genannte immer noch korrekt ist, I finde immer noch, dass ich irgendwo einen Schurken habe, den ich mit irgendwelchen nicht geschlossenen Buffern nicht erklären kann ... Es scheint, dass das Eingeben, Beenden und Wiedereröffnen einfach ausreicht, um dieses zu verursachen. Vielleicht verursachen die Gläser, die wir einführen, das. – CodeMonkey

+0

Das kann für Multiplayer/TurnBasedMatches-Funktionen der Fall sein, aber in meiner App verwende ich nur "unlockAchievementImmediate" und "submitScoreImmediate", die keine Puffer zurückgeben. – cavpollo

1

Jede Unterklasse des Datenpuffers muss freigegeben werden. Wenn Sie mit dem Objekt fertig sind, geben Sie es frei.

Das Datenpufferobjekt enthält eine release() Methode. Wenn Sie mit dem Objekt fertig sind, geben Sie es einfach mit databuffer.release(); frei.

+0

Zu dem Zeitpunkt, als ich die App entwickelte (ich weiß nicht, ob sich seitdem etwas geändert hat), habe ich nur die Methoden "unlockAchievementImmediate" und "submitScoreImmediate" verwendet. Diese Funktionen haben keine Puffer zurückgegeben, daher konnte nichts freigegeben werden. – cavpollo