Je reçois la violation suivante rapportée par strictmode dans Android.
02-05 04: 07: 41.190: Erreur / StrictMode (15093): une ressource a été acquise à la trace de la pile jointe mais jamais libérée. Voir java.io.flageable pour informations sur l'évitement des fuites de ressources. 02-05 04: 07: 41.190: Erreur / StrictMode (15093): Java.lang.throwable: terminaison explicite Méthode 'Fermer' non appelée P> BlockQuote>
Il s'agit de berceser les flux de fermeture correctement. Cependant, ne devrait pas fermer
dans code> fermer les flux sous-jacents? Quelle pourrait être la raison de l'erreur marquée? P>
xxx pré> p>
4 Réponses :
Si vous recherchez ObjectOutpustream Source, vous verrez que sa méthode de fermeture ferme la flux sous-jacent. Le mode strict de Android comme de nombreux autres outils d'analyse de code ont de faux positifs que vous pouvez ignorer ou réécrire votre code de manière à ne pas se plaindre (méthode closequie en ligne). P>
Le strictMode de Android n'est pas un outil d'analyse de code. Il est implémenté dans le code source Voir FileInputStream code> et
fermerguard code> dans
finaliser () code>.
Le code doit fonctionner, sauf si vous utilisez PROGUARD qui pourrait vous gâter un peu avec byTecode.
Je pense que fichierInputtream code> a des hameçons à
fermerguard code> qui est vérifié () Si l'instance était fermée. C'est pourquoi je pense que cela devrait fonctionner. La question est la question de la météo
ferme () code> a été invoquée ou non? P>
fichierInputtream code> a été créé (parce que StrictMode a lancé une exception), puis une exception jeté enfin et ignoré quelque part. p>
En regardant le code source, les constructeurs pour depuis La solution la plus simple que je suggère est de diviser cette allocation en 3 variables et d'appeler ObjectInPhatStream code>
et bufferedInputStream code>
peut lancer des exceptions qui Serait attribué un objet FileInputStream code> sur la ligne suivante, mais la variable
in code> sera toujours null:
Dans CODE> est NULL lorsque nous arrivons au bloc
enfin code>, que Ouvrir
fichierInputtream code> objet ne sera pas fermé par votre
clorequiely () code> méthode, provoquant
strictmode code> pour se plaindre d'éventuellement :) p>
clorequiely () code> sur chacun, peut-être quelque chose comme ceci: p>
Bien repéré, mais dans mon cas, aucune exception ne se produise. (Je vais revenir en arrière et vérifier cela pour être absolument sûr.)
Peut-être que je me trompe ici, mais ne me plaint pas de "scénarios possibles" aussi? Il se plaint par exemple sur l'accès IO du fil principal, même si aucun ANR n'est effectivement causé.
Il est censé se plaindre de choses qui se produisent réellement. Dans le cas de l'accès IO sur le fil principal, l'accès est vraiment sur le fil principal. (Ce n'est pas seulement théorique.) Donc, il ne devrait donc que se plaindre de la fuite d'introuvream si elle a vraiment fui.
Vous obtenez la prime pour trouver un véritable problème dans le code de l'OP qui pourrait provoquer une fuite. Je ne suis pas la puissance et mon propre code est très similaire, mais subtilement différent, et je dois toujours me mettre complètement au fond.
Merci! Si vous voulez aussi de l'aide pour déterminer le problème dans votre code aussi, l'ajout d'un lien à partir d'ici aura probablement ajouté plusieurs ensembles de nouveaux yeux pour le regarder aussi :)
in = new ObjectInputStream(new BufferedInputStream( new FileInputStream(mFile), STREAM_BUFFER_SIZE)); In this code sample you only close the ObjectInputStream but not the BufferedInputStream or the FileInputStream, you need to close them all.
Est-ce que tu? Cela contredit la réponse de Konstantin Solomatov.
@Grahamborland a juste exécuté un test dessus et vous verrez.
Je ne sais pas comment est intelligent le vérificateur strictmode, mais il ressemble à sa confusion par votre différé fermer i> b>, c'est-à-dire à l'aide d'un utilitaire pour fermer votre flux pour vous.
Dans mon cas, j'obtiens cette erreur même lorsque le
ferme () code> est en ligne dans la clause
enfin code>.