StrictMode beschwert sich darüber, dass InputStream nicht geschlossen wurde

8

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?

%Vor%     
Roopesh Kohad 01.03.2012, 11:36
quelle

4 Antworten

9

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:

%Vor%

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:

%Vor%     
Joe 24.09.2012 21:17
quelle
0

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

    
Konstantin Solomatov 01.03.2012 12:43
quelle
0

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.

%Vor%     
pawelzieba 24.09.2012 13:08
quelle
0
%Vor%

In diesem Codebeispiel schließen Sie nur die ObjectInputStream , aber nicht die BufferedInputStream oder FileInputStream , Sie müssen alle schließen.

    
Ilya Gazman 27.09.2012 14:06
quelle