Vraag statische variabele null bij terugkeer naar de app


In mijn app is er een statische variabele die wordt ingesteld op nul wanneer ik vanuit de externe browser terugkeer naar mijn app. Het lijkt erop dat de app of een deel ervan wordt gedood als de externe webpagina die ik start complex genoeg is.

Als de app volledig zou worden gedood en vervolgens zou worden losgelaten van de hoofdactiviteit, zou dat goed zijn, maar de doorstart is van de activiteit die de browser heeft gestart - en het is niet de bedoeling de app-status in te stellen, zodat deze crasht bij toegang tot de ongeldige statische variabele . Dit is een zesdelig apparaatprobleem voor mij, dus ik heb advies nodig.

Is er een vlag die moet worden ingesteld om dit gedrag te voorkomen?


50
2018-03-02 23:12


oorsprong


antwoorden:


Dit is standaardgedrag in de meeste mobiele besturingssystemen, zeker inclusief Android. Uw app is in feite heel vaak gedood als een andere applicatie met een hogere prioriteit (meestal, als het op de voorgrond staat, hogere prioriteit heeft) de middelen nodig heeft. Dit komt door de aard van mobiele apparaten met relatief beperkte middelen.

Je moet je gegevens ergens duurzamer opslaan. Misschien vindt u dit artikel over het algemeen Data opslag nuttig zijn. Deze vraag moet ook relevant zijn: Android-status opslaan met de status Instance opslaan

Merk op dat dit in feite is niet een probleem met het probleem van één op zes. Dit is een "probleem" alle apparaten, het is gewoon duidelijker op een van uw apparaten, waarschijnlijk omdat het minder geheugen heeft. Als u een zeer geheugenintensieve app uitvoert op een van uw andere apparaten, zou u hetzelfde gedrag moeten zien. Er is ook geen vlag om dit te voorkomen. Dit is standaard en wordt verwacht.


35
2018-03-02 23:21



Meestal gebeurt dit wanneer het apparaat wordt gebruikt slaapstand.

Dit gedrag van het apparaat kan worden geëmuleerd door de volgende stappen:

  1. Start de app en druk op de Home-knop
  2. Selecteer in Android Studio in de linkerbenedenhoek de foutopsporing in de toepassing en druk op de X-knop (beëindig applicatie) links van de applicatie. (Ik weet niet hoe ik Eclipse moet maken, maar ik denk hetzelfde)
  3. Klik op het pictogram van de toepassing op het apparaat.

Als de taak activiteit was, wordt de app geopend tijdens de laatste activiteit en (hoogstwaarschijnlijk) wordt een fout gegenereerd, omdat alle statische variabelen zijn leaved.


18
2017-12-08 13:18



De oplossing voor het gebruik van static's (singleton's) in Android is heel eenvoudig:

Implementeer een klasse die zich uitstrekt android.app.Application en doe al je singleton-initialisatie binnen onCreate()

Redenering:

  • de klasse die de toepassing uitbreidt, wordt eerst uitgevoerd, zelfs wanneer het proces van uw app wordt beëindigd vanwege een lage geheugenconditie
  • uw app heeft context zodra Application.onCreate () wordt aangeroepen

5
2018-05-01 16:50



Nee ... u moet geen gegevens opslaan in statische variabelen op Android. Als je erop staat om dit te doen, zul je ervan moeten kunnen herstellen wanneer het nul is. Je zou je staat moeten redden met bundels of andere middelen.


4
2018-03-02 23:14



U moet uw waarden opslaan in onaveInstanceState en weer ophalen in onRestoreInstanceState, omdat wanneer een activiteit de statuslevenscyclus van de status stopt, alle statische waarden nul zijn.

bijvoorbeeld:

        /* 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
2017-08-20 08:38



Waarschijnlijk wil je gewoon de tweede link van kabuko volgen. Maar als u uw statische variabele wilt behouden (misschien heeft u hier een goede reden voor), dan zou u dit kunnen doen:

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

   return myVar;
}

Op die manier kunt u uw oproepen vervangen door myVar.test () met getVariable (). Test () en weet u dat dit nooit een nul-wijzeruitzondering zal veroorzaken.


0
2018-03-03 00:41



Gebruik de toepassingklasse voor dergelijke dingen. Het wordt altijd geïnstantieerd voordat een onderdeel (activiteiten, services, ontvangers) van uw app wordt gestart. Dus je bent er zeker van dat alle statische variabelen er zijn en geïnitialiseerd.


0
2018-01-15 15:44