web-dev-qa-db-fra.com

variable statique null lors du retour à l'application

Dans mon application, une variable statique est définie sur null lorsque je reviens dans mon application à partir du navigateur externe. On dirait que l'application ou une partie de celle-ci est supprimée si la page Web externe que je lance est suffisamment complexe. 

Si l'application devait être entièrement supprimée, puis relâchée de l'activité principale, tout irait bien, mais la relance proviendrait de l'activité qui a démarré le navigateur. . C'est un problème de périphérique sur six pour moi, alors j'ai besoin de conseils.

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

51
jchristof

Il s'agit du comportement standard de la plupart des systèmes d'exploitation mobiles, notamment Android. Votre application est en fait très souvent tuée si une autre application avec une priorité plus élevée (généralement si elle est au premier plan est une priorité plus haute) a besoin de ressources. Cela est dû à la nature des appareils mobiles ayant des ressources relativement limitées.

Vous devriez enregistrer vos données dans un endroit plus durable. Vous pourriez trouver cet article général Stockage de données être utile. Cette question devrait également être pertinente: Enregistrement de l'état d'activité Android à l'aide de l'option Enregistrer l'état de l'instance

Notez que ceci est en fait pas un problème de périphérique sur six. Ceci est un "problème" sur tous les périphériques, il est juste plus évident sur l'un de vos périphériques probablement parce qu'il a moins de mémoire. Si vous exécutez une application gourmande en mémoire sur l'un de vos autres appareils, vous devriez observer le même comportement. En outre, il n'y a pas de drapeau pour empêcher cela. C'est standard et attendu.

36
kabuko

Cela se produit généralement 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 utiliser Eclipse, mais je pense la même chose)
  3. Cliquez sur l'icône de l'application sur l'appareil .

Si la tâche était en activité, l'application s'ouvrirait lors de la dernière activité et (très probablement) générerait une erreur, car toutes les variables statiques ont été supprimées .

20
Vladimir Mamulov

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

Implémentez une classe qui étend Android.app.Application et faites toute votre initialisation de singleton dans onCreate()

Raisonnement:

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

Non ... vous ne devriez pas stocker de données dans des variables statiques sur Android. Si vous insistez pour le faire, vous devez pouvoir le récupérer lorsqu'il est nul. Vous devez enregistrer votre état avec des bundles ou d'autres moyens.

4
Manfred Moser

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

par exemple:

        /* save my satatic hashmap in case of activity stopped to retrieve 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<Permission> iterator = Common.PERMISION_MAP.values()
                        .iterator();
                ArrayList<Permission> permissionList = new ArrayList<Permission>();
                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<Permission> permissionList = savedInstanceState
                        .getParcelableArrayList("PERMISSION_LIST");

                if (Common.PERMISION_MAP == null)
                    Common.PERMISION_MAP = new HashMap<Permission, Permission>();
for (Permission permission : permissionList) {
                Common.PERMISION_MAP.put(permission, permission);

            }   
                } catch (Exception ex) {
                String string = ex != null ? ex.getMessage() : "";
                Log.e(TAG, (string != null ? string : ""));
                ex.printStackTrace();

            }
        }
1
Mohamed Fadl Allah

Lorsque vous quittez votre application et que vous changez de navigateur, votre application est en arrière-plan. Donc, vous devez suivre ces étapes

  1. Commencez par initialiser votre variable statique dans Sharedpreferece ou dans savedInstanceState comme suit

    sharedpreference.purString("your_static_variable_name","your_static_variable_value").
    

    ou

    savedInstanceState.putString("your_static_variable_name","your_static_variable_value").
    

lors de la première exécution de la méthode d'activité oncreate() ou ailleurs

  1. Deuxièmement, réinitialisez vos variables statiques dans les méthodes onResume() via sharedpreference ou savedInstance selon ce qui a été utilisé précédemment.
0
Himanshu Saxena

Utilisez la classe d'application pour de telles choses. Il est toujours instancié avant le démarrage d’un composant (activités, services, récepteurs) de votre application. Vous êtes donc sûr que toutes les variables statiques sont présentes et initialisées.

0
Ali

Vous voulez probablement juste suivre le deuxième lien par Kabuko. Mais si vous voulez conserver votre variable statique (vous avez peut-être une bonne raison à 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 que cela ne provoquera jamais d'exception de pointeur null.

0
Mark D