2013-04-12 14 views
19

Moja aplikacja ulega awarii po długim biegu jałowym w tle. Po debugowaniu i stwierdziłem, że przyczyną awarii jest NullPointerException. Wyjątek wynikał z faktu, że dane w klasie pojedynczej aplikacji są niszczone przez garbage collector, gdy aplikacja działa w tle. Używam danych statycznych w każdym działaniu w mojej aplikacji.Aplikacja ulega awarii po przywróceniu z tła po długim czasie.

Moje pytanie brzmi: czy istnieje sposób na utrzymanie trwałości danych klasy aplikacji w tle? Czy jest jakieś inne rozwiązanie?

+0

Zobacz http://developer.android. com/reference/android/app/Activity.html # onSaveInstanceState (android.os.Bundle) –

Odpowiedz

13

Aby uzyskać dokładniejszą odpowiedź, umieść tutaj swój kod. W trybie Android pamięć jest ograniczona, więc VM może usunąć dowolny fragment kodu, który wydaje się zbędny.

Zajrzyj do metody cyklu życia aktywności, w szczególności do onResume i upewnij się, że rozumiesz to doskonale. Tyle razy zdarza się, że aplikacja się zawiesza, tylko dlatego, że nie używa ona prawidłowo metody cyklu życia.

Inną ważną kwestią do rozważenia dla działania jest, bez względu na to, co się stało z danymi trwałości, które aktywność powinna wyświetlić jego interfejs z pewną wartością domyślną. Więc założenie jest takie, , jeśli mam dane, które będę wyświetlać, jeśli nie, naprawdę nie obchodzi mnie. Twój interfejs użytkownika nigdy nie powinien się zawieść z danymi lub bez nich. Możesz użyć String.xml do przechowywania niektórych wartości domyślnych lub nawet w układach.

jeśli nadal chcesz iść z klasą singleton, co jest całkowicie w porządku, ale upewnij się, że wykonujesz następujące sprawdzanie za każdym razem, gdy próbujesz uzyskać dostęp do singletonu.

if (instance==null) 
    instance=Singleton.getInstance() 

metoda getInstance() nie tylko powrót bieżące wystąpienie będzie również upewnić się, że

  • inicjuje cały obiekt i zmienne
  • inne metody singleton jak metody instancji

Do nie ma statycznego dostępu do danych z jednego działania do drugiego. To nie jest dobre dla Androida specjalnie dla problemu typu, z którym teraz się mierzysz, a także nie jest bardzo dobrą praktyką programowania OOP.

SharedPreference to dobry sposób na utrwalanie danych, jeśli spełniają one wymagania klienta.

jeśli chcesz przekazać dane z różnych składników systemu Android, takich jak Aktywność, Usługa lub Transmisja, możesz umieścić je w pakiecie i wysłać jako zamiar. I, jak zawsze są SQLLite ich przechowywanie danych, plik IO itp itd

+0

dzięki za odpowiedź minhaz, opisałeś bardzo dokładnie. –

+1

+1 za "Twój interfejs użytkownika nigdy nie powinien się zawieszać z danymi lub bez nich". – OneThreeSeven

0

starają się unikać używania zmiennych statycznych w aplikacji, które powodują tego rodzaju problemów. Spróbuj zapisać swoje dane we wspólnych preferencjach i używaj ich.

1

Jeśli możesz, zapisz go na inne sposoby. W przypadku złożonych struktur danych konieczne może być ponowne uruchomienie aplikacji. Na przykład mam w aplikacji singleton User, który przechowuje dane logowania do mojego serwera. Nie mogłem ich zapisać, jeśli próbowałem - wiele danych jest ukrytych w zmiennych AWS. To, co musiałem zrobić, to wykryć, kiedy byliśmy ponownie uruchamiani ze strony głównej po oczyszczeniu (w przeciwieństwie do ponownego uruchomienia) i uruchomiliśmy działanie początkowe, a następnie zakończyłem bieżącą aktywność. I musiałem to dodać do każdego działania w mojej aplikacji.

+3

Jak to zrobiłeś? – AlvaroSantisteban

0

Activity już widoczne jest to dlaczego to będzie OnStop() zamiast onResume()

Powiązane problemy