2012-07-14 14 views
6

Mam klasę danych Singleton, której używam do przechowywania danych. Mam dostęp do niego w różnych Fragment s.OnSaveInstanceState z Singleton

Po załadowaniu pierwszego Fragment, nie ma problemu, że wszystkie pola w Singletonie są null. Po wyświetleniu drugiego Fragment, zależy to od tych pól, aby wyświetlić swoje dane. Pierwszy Fragment zapewnia inicjalizację tych pól.

Jednak, gdy użytkownik naciśnie przycisk home w drugim Fragment i otwiera go ponownie po jak godzinę lub tak, to Singleton traci wszystkie swoje dane, a Fragment próbuje uzyskać dostęp null pól.

Chciałem wdrożyć metodę onSaveInstanceState, ale jestem zaskoczony, jak to działa - nie mam instancji danych, aby ją przypisać.

@Override 
public void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 
    outState.putSerializable("DATA", Data.getInstance()); 
} 

@Override 
public void onCreate(Bundle savedInstanceState){ 
    super.onCreate(savedInstanceState); 

    savedInstanceState.getSerializable("DATA"); //What to do with this? 
} 

Każda pomoc jest mile widziane.

+0

Ale nie jestem pewien, czy rozumiem, dlaczego singleton straciłby wszystkie swoje dane? Aplikacja nadal działa w tle, prawda? Używam tego samego paradygmatu w mojej aplikacji i nie widziałem utraty danych. – Aviral

+0

Mam ten problem, więc myślę, że tak. – nhaarman

+0

Interesujące! Jeśli masz pojęcie, co powoduje zniknięcie danych w singletonie, opublikuj. To mnie niepokoi. Dzięki. – Aviral

Odpowiedz

1

Czy fragmenty hostowane są w tej samej czynności? Jeśli tak, to dlaczego nie przechowywać stanu współdzielonego w elemencie działania i użyć funkcji onSaveInstanceState() i onCreate() działania, aby je zapisać i przywrócić. W swoim fragmenty można następnie zrobienia ...

((MyActivityClass)getActivity()).getSharedState() 

W przeciwnym razie, można dokonać Singleton obiektem zarządzać obiektu użytkownika, które mogą być odcinkach i rozszeregować:

MySingleton.instance().saveTo(outState); 
MySingleton.instance().restoreFrom(savedInstanceState); 
MySingleton.instance().getState(); 

Gdzie

public void restoreFrom(Bundle savedInstanceState) { 
    mState = savedInstanceState.getSerializable("DATA"); 
} 
+0

Lepiej używać Parcable ze względów związanych z wydajnością. – Roel

0

Możesz rzucić okiem na this. Metoda onSaveInstanceState nie jest wskazana, jeśli trzeba przenosić duże obiekty.