variable statique null lors du retour à l’application

Dans mon application, une variable statique est définie sur null lorsque je retourne à mon application à partir du navigateur externe. Il semble que l’application ou une partie de celle-ci soit détruite si la page Web externe que je lance est suffisamment complexe.

Si l’application devait être entièrement supprimée et relancée à partir de l’activité principale, cela serait correct, mais la relance provient de l’activité qui a démarré le navigateur – et il n’est pas destiné à définir l’état de l’application afin . C’est un problème de périphérique sur six pour moi, donc j’ai besoin de conseils.

Y a-t-il un indicateur à définir pour empêcher ce comportement?

C’est un comportement standard dans la plupart des systèmes d’exploitation mobiles, y compris sans aucun doute Android. En fait, votre application est très souvent détruite si une autre application avec une priorité plus élevée (en général, si elle est prioritaire) a besoin des ressources. Cela est dû à la nature des appareils mobiles ayant des ressources relativement limitées.

Vous devriez enregistrer vos données quelque part plus durable. Vous pourriez trouver cet article sur le stockage de données général utile. Cette question devrait également être pertinente: Enregistrement de l’état d’activité Android à l’aide de la commande Enregistrer l’état

Notez que ce n’est en fait pas un problème de périphérique sur six. Ceci est un “problème” sur tous les appareils, il est juste plus apparent sur l’un de vos appareils, probablement parce qu’il a moins de mémoire. Si vous exécutez une application très gourmande en mémoire sur l’un de vos autres appareils, vous devriez voir le même comportement. Il n’y a pas non plus de drapeau pour empêcher cela. Ceci est standard et attendu.

Habituellement, cela se produit lorsque l’appareil passe en mode veille .

Ce comportement du périphérique peut être imité par les étapes suivantes:

  1. Exécutez l’application et appuyez sur le bouton Accueil
  2. Dans Android Studio dans le coin inférieur gauche, sélectionnez l’application mise au point et appuyez sur le bouton X (terminer l’application) à gauche du nom de l’application. (Je ne sais pas comment Eclipse, mais je pense pareillement)
  3. Cliquez sur l’icône de l’application sur l’appareil .

Si la tâche était une activité, l’application s’ouvrira sur la dernière activité et générera probablement une erreur, car toutes les variables statiques ont été laissées .

La solution pour utiliser des statiques (singleton) dans Android est très simple:

Implémentez une classe qui étend android.app.Application et onCreate() toutes vos initialisations singleton dans onCreate()

Raisonnement:

  • la classe qui étend Application est exécutée en premier, même lorsque le processus de votre application est interrompu en raison d’une condition de mémoire faible
  • votre application a un contexte dès que Application.onCreate () est appelée

Non … vous ne devez pas stocker de données dans des variables statiques sur Android. Si vous insistez pour le faire, vous devrez être capable de le récupérer quand il est nul. Vous devriez enregistrer votre état avec des paquets ou d’autres moyens.

Vous devez enregistrer vos valeurs dans onSaveInstanceState et les récupérer dans onRestoreInstanceState car, lorsqu’une activité passe en arrêt sur le cycle de vie de l’état, toutes les valeurs statiques sont nulles.

par exemple:

  /* save my satatic hashmap in case of activity stopped to resortingeve it again in onRestoreInstanceState method*/ @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); //Common.PERMISION_MAP static hashmap if (Common.PERMISION_MAP != null) { Iterator iterator = Common.PERMISION_MAP.values() .iterator(); ArrayList permissionList = new ArrayList(); while (iterator.hasNext()) { Permission permission = (Permission) iterator.next(); permissionList.add(permission); } outState.putParcelableArrayList("PERMISSION_LIST", permissionList); } } /* restore my satatic hashmap when activity stopped */ @Override protected void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); try { ArrayList permissionList = savedInstanceState .getParcelableArrayList("PERMISSION_LIST"); if (Common.PERMISION_MAP == null) Common.PERMISION_MAP = new HashMap(); for (Permission permission : permissionList) { Common.PERMISION_MAP.put(permission, permission); } } catch (Exception ex) { Ssortingng ssortingng = ex != null ? ex.getMessage() : ""; Log.e(TAG, (ssortingng != null ? ssortingng : "")); ex.printStackTrace(); } } 

Vous voulez probablement suivre le deuxième lien de kabuko. Mais si vous voulez conserver votre variable statique (peut-être avez-vous de bonnes raisons pour cela), vous pouvez le faire:

 private static MyObjType getVariable() { if (myVar == null) myVar = new MyObjType(); // do whatever else you need to here return myVar; } 

De cette façon, vous pouvez remplacer vos appels à myVar.test () par getVariable (). Test () et vous savez qu’il ne provoquera jamais une exception de pointeur nul.

Utilisez la classe d’application pour de telles choses. Il est toujours instancié avant que les composants (activités, services, récepteurs) de votre application ne commencent. Vous êtes donc certain que toutes les variables statiques sont là et initialisées.