8
votes

StrictMode se plaint de l'introuvable ne pas être fermé

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

Il s'agit de berceser les flux de fermeture correctement. Cependant, ne devrait pas fermer dans fermer les flux sous-jacents? Quelle pourrait être la raison de l'erreur marquée? xxx


2 commentaires

Je ne sais pas comment est intelligent le vérificateur strictmode, mais il ressemble à sa confusion par votre différé fermer , 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 () est en ligne dans la clause enfin .


4 Réponses :


0
votes

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


1 commentaires

Le strictMode de Android n'est pas un outil d'analyse de code. Il est implémenté dans le code source Voir FileInputStream et fermerguard dans finaliser () .



0
votes

Le code doit fonctionner, sauf si vous utilisez PROGUARD qui pourrait vous gâter un peu avec byTecode.

fichierInputtream a des hameçons à fermerguard 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 () a été invoquée ou non?

Je pense que fichierInputtream a été créé (parce que StrictMode a lancé une exception), puis une exception jeté enfin et ignoré quelque part. xxx


0 commentaires

10
votes

En regardant le code source, les constructeurs pour ObjectInPhatStream et bufferedInputStream peut lancer des exceptions qui Serait attribué un objet FileInputStream sur la ligne suivante, mais la variable in sera toujours null: xxx

depuis Dans est NULL lorsque nous arrivons au bloc enfin , que Ouvrir fichierInputtream objet ne sera pas fermé par votre clorequiely () méthode, provoquant strictmode pour se plaindre d'éventuellement :)

La solution la plus simple que je suggère est de diviser cette allocation en 3 variables et d'appeler clorequiely () sur chacun, peut-être quelque chose comme ceci: xxx


5 commentaires

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



0
votes
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.

2 commentaires

Est-ce que tu? Cela contredit la réponse de Konstantin Solomatov.


@Grahamborland a juste exécuté un test dessus et vous verrez.