zmienna statyczna null po powrocie do aplikacji

W mojej aplikacji jest zmienna statyczna, która jest ustawiana na null, gdy wracam do mojej aplikacji z zewnętrznej przeglądarki. Wygląda na to, że aplikacja lub jej część jest zabijana, jeśli zewnętrzna strona internetowa, którą uruchamiam, jest wystarczająco złożona.

Jeśli aplikacja zostanie całkowicie zabita, a następnie ponownie uruchomiona z głównej aktywności, która byłaby ok, ale ponowne uruchomienie pochodzi z aktywności, która uruchomiła przeglądarkę - i nie jest przeznaczone do ustawiania stanu aplikacji, więc zawiesza się podczas uzyskiwania dostępu do statycznej wartości null zmienna. To jest jeden na sześć problem urządzenia dla mnie, więc potrzebuję porady.

Czy istnieje flaga, aby zapobiec temu zachowaniu?

Author: jchristof, 2012-03-03

7 answers

Jest to standardowe zachowanie w większości mobilnych systemów operacyjnych, zdecydowanie w tym Android. Twoja aplikacja jest w rzeczywistości bardzo często jest zabijana, jeśli inna aplikacja o wyższym priorytecie (ogólnie, jeśli jest na pierwszym planie, ma wyższy priorytet) potrzebuje zasobów. Wynika to z charakteru urządzeń mobilnych o stosunkowo ograniczonych zasobach.

Powinieneś zapisać swoje dane w miejscu trwalszym. Ten artykuł na temat ogólnego przechowywania danych może być przydatny. To pytanie powinno być również istotne: zapisywanie stanu aktywności Androida za pomocą stanu zapisu instancji

Zauważ, że w rzeczywistości jest to , a nie Problem jednego z sześciu urządzeń. Jest to "problem" na WSZYSTKICH urządzeniach, jest to po prostu bardziej widoczne na jednym z Twoich urządzeń, prawdopodobnie dlatego, że ma mniej pamięci. Jeśli korzystasz z aplikacji o bardzo dużej pamięci na dowolnym innym urządzeniu, powinieneś zobaczyć to samo zachowanie. Również nie ma flagi, aby temu zapobiec. Jest to standard i oczekiwane.

 35
Author: kabuko,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:55:04

Zwykle dzieje się tak, gdy urządzenie przechodzi w tryb uśpienia .

To zachowanie urządzenia można emulować za pomocą następujących kroków:

  1. Uruchom aplikację i naciśnij przycisk Home
  2. W Android Studio w lewym dolnym rogu wybierz opcję Debuguj aplikację i naciśnij przycisk X (Zakończ aplikację) po lewej stronie nazwy aplikacji. (Nie wiem jak zaćmić, ale myślę podobnie)
  3. Kliknij ikonę aplikacji na urządzenie .

Jeśli zadaniem było działanie, aplikacja otworzy się przy ostatniej aktywności i (najprawdopodobniej) wygeneruje błąd, ponieważ wszystkie zmienne statyczne zostały pozostawione.

 18
Author: Vladimir Mamulov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-08 13:18:47

Rozwiązanie do używania static 's (singleton' s) W Androidzie jest bardzo proste:

Zaimplementuj klasę, która rozszerza android.app.Application i wykonaj całą inicjalizację Singletona w onCreate()

Rozumowanie:

  • klasa, która rozszerza aplikację jest wykonywana jako pierwsza, nawet gdy proces aplikacji jest zabity z powodu niskiego stanu pamięci
  • Twoja aplikacja ma kontekst zaraz po aplikacji.onCreate () nazywa się
 5
Author: Someone Somewhere,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-01 16:50:26

Nie... nie należy przechowywać danych w zmiennych statycznych na Androidzie. Jeśli nalegasz na to, będziesz musiał być w stanie odzyskać od niego, gdy jest null.. powinieneś zapisać swój stan za pomocą wiązek lub innych środków.

 4
Author: Manfred Moser,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-02 23:14:56

Musisz zapisać swoje wartości w onSaveInstanceState i odzyskać je w onRestoreInstanceState, ponieważ gdy aktywność przejdzie do cyklu życia stanu zatrzymanego, wszystkie wartości statyczne będą równe null.

Eg:

        /* 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
Author: Mohamed Fadl Allah,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-20 08:38:47

Prawdopodobnie po prostu chcesz podążać za drugim linkiem kabuko. Ale jeśli chcesz zachować swoją zmienną statyczną (być może masz ku temu jakiś powód), możesz to zrobić:

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

   return myVar;
}

W ten sposób możesz zastąpić swoje połączenia do myVar.test () z getVariable ().test () i wiesz, że nigdy nie spowoduje wyjątku wskaźnika null.

 0
Author: Mark D,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-03 00:41:22

Użyj klasy aplikacji do takich rzeczy. Jest on zawsze tworzony przed uruchomieniem jakiegokolwiek komponentu (aktywności, usług, odbiorników) Twojej aplikacji. Więc jesteś pewien, że wszystkie statyczne zmienne są tam i zainicjalizowane.

 0
Author: Ali,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-15 15:44:48