48 votes

Android StrictMode InstanceCountViolation

Je suis en cours d'exécution de mon application avec StrictMode activé dans le développement, comme indiqué ici StrictMode pour la plate-forme inférieure versions et a remarqué un message d'erreur que je ne sais pas quoi penser et je ne peux trouver aucune référence.

Je reçois android.os.StrictMode$InstanceCountViolation avec des valeurs de instances et limit par exemple

cas=3; limite=2

Maintenant je me demande:

  • A) quelle est la limite calculée
  • B) comment une telle violation effectivement arriver et puis je veux le regarder dans les possibilités de contournement.

Des idées?

9voto

Neromancer Points 326

Il semble qu'il ya peut-être un bug dans le StrictMode vérification sur certains appareils.

Si une Activité est commencé, et quitté et redémarré très rapidement, vous pouvez obtenir un StrictMode.InstanceCountViolation.

Cependant, c'est tout simplement parce que le garbage collector n'a pas encore finalisé la première instance de l'Activité, ce qui signifie que temporairement 2 (ou plus) les instances en mémoire.

Système D'Appel.gc() avant startActivity() ou startActivityForResult() pour arrêter l'StrictMode.InstanceCountViolation.

Ceci semble indiquer un bug (ou peut-être une fonctionnalité?) dans le StrictMode vérification.

7voto

jpotter6 Points 660

Voici une discussion sur des groupes de google à propos de la manipulation de la StrictMode InstanceCountViolation. Il ressemble à tous les différentes version d'Android a une politique différente de sorte qu'ils semblent juste la désactiver. Aussi le Android docs dire sur le Mode Strict

Mais ne vous sentez pas obligé de corriger tout ce qui StrictMode trouve. En particulier, de nombreux cas de l'accès au disque est souvent nécessaire lors de l'activité normale du cycle de vie. Utilisation StrictMode de trouver des choses que vous avez fait par accident. Les demandes de réseau sur le thread d'INTERFACE utilisateur sont presque toujours un problème, cependant.

Je pense que c'est ce que @sri est d'essayer de montrer avec son code.

public class MyApplication extends Application {

@Override 
public void onCreate (){
   super.onCreate();
   // when you create a new application you can set the Thread and VM Policy
   StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
   .detectCustomSlowCalls() // API level 11, to use with StrictMode.noteSlowCode
   .detectDiskReads()
   .detectDiskWrites()
   .detectNetwork()
   .penaltyLog()
   .penaltyFlashScreen() // API level 11
   .build());

//If you use StrictMode you might as well define a VM policy too

   StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
   .detectLeakedSqlLiteObjects()
   .detectLeakedClosableObjects() // API level 11
   .setClassInstanceLimit(Class.forName("com.apress.proandroid.SomeClass"), 100)
   .penaltyLog()
   .build());
 }
}

2voto

Je crois comprendre que cette violation est utilisée pour détecter les fuites de mémoire. Donc, à ce stade, vous ne devriez avoir que 2 instances de la classe chargée, mais la VM en a trouvé 3.

J'ai également constaté cette violation dans mon code, mais mes instances supplémentaires étaient toutes référencées par des pointeurs faibles. J'ai donc choisi de désactiver cette règle.

-3voto

sri Points 121

voir l'exemple ci-dessous, il varie en fonction de la version Android

 public class MyApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
            .detectCustomSlowCalls() // API level 11, to use with StrictMode.noteSlowCode
            .detectDiskReads()
            .detectDiskWrites()
            .detectNetwork()
            .penaltyLog()
            .penaltyFlashScreen() // API level 11
            .build());

        // not really performance-related, but if you use StrictMode you might as well define a VM policy too
        StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
            .detectLeakedSqlLiteObjects()
            .detectLeakedClosableObjects() // API level 11
            .setClassInstanceLimit(Class.forName("com.apress.proandroid.SomeClass"), 100) // API level 11
            .penaltyLog()
            .build());
    }
}
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X