Ich bekomme den folgenden Verstoß von StrictMode in Android gemeldet.
02-05 04: 07: 41.190: ERROR / StrictMode (15093): Eine Ressource wurde erworben bei angehängten Stack-Trace, aber nie veröffentlicht. Siehe java.io.Closeable für Informationen zur Vermeidung von Ressourcenlecks. 02-05 04: 07: 41.190: ERROR / StrictMode (15093): java.lang.Throwable: Explizite Beendigung Methode 'Schließen' nicht aufgerufen
Es wird kritisiert, Ströme nicht richtig zu schließen. Sollte das Schließen von in
jedoch nicht die zugrunde liegenden Streams schließen? Was könnte der Grund für den markierten Fehler sein?
Mit Blick auf den Quellcode, die Konstruktoren für beide ObjectInputStream
und BufferedInputStream
kann Ausnahmen auslösen, die dazu führen, dass ein FileInputStream
-Objekt in der folgenden Zeile zugewiesen wird, aber die in
Variable ist immer noch Null:
Da in
null ist, wenn wir zum finally
-Block gelangen, wird das offene FileInputStream
-Objekt nicht von Ihrer closeQuietly()
-Methode geschlossen, was StrictMode
schließlich dazu bringt, sich zu beschweren:)
Die einfachste Lösung, die ich vorschlagen würde, ist diese Aufteilung in 3 Variablen aufzuteilen und closeQuietly()
auf jedem zu nennen, vielleicht in etwa so:
Wenn Sie sich die ObjectOutpuStream-Quelle ansehen, werden Sie sehen, dass die close-Methode den zugrunde liegenden Stream schließt. Der strikte Modus von Android hat wie viele andere Code-Analyse-Tools falsche Positive, die Sie entweder ignorieren oder Ihren Code neu schreiben können, so dass er sich nicht beschweren wird (inline closeQuietly-Methode).
Der Code sollte funktionieren, es sei denn, Sie verwenden ProGuard, das mit Bytecode etwas durcheinander kommen könnte.
FileInputStream
hat Hooks zu CloseGuard
, die in finalize () eingecheckt werden, wenn die Instanz geschlossen wurde. Deshalb denke ich, dass es funktionieren sollte. Die Frage ist Wetter close()
wurde aufgerufen oder nicht?
Ich denke, dass FileInputStream
erstellt wurde (weil StrictMode ausgelöst wurde Ausnahme), aber dann wurde schließlich eine Ausnahme geworfen und irgendwo ignoriert.
In diesem Codebeispiel schließen Sie nur die ObjectInputStream
, aber nicht die BufferedInputStream
oder FileInputStream
, Sie müssen alle schließen.
Tags und Links java android strictmode objectinputstream