2012-07-14 16 views
6

Ho una classe Singleton Data, che utilizzo per memorizzare i dati. Sto accedendo in diversi Fragment s.OnSaveInstanceState con Singleton

Quando viene caricato il primo Fragment, non c'è alcun problema che tutti i campi nel Singleton siano null. Quando viene mostrato il secondo Fragment, dipende da questi campi per mostrare i suoi dati. Il primo Fragment assicura che questi campi siano inizializzati.

Tuttavia, quando l'utente preme il tasto home nel secondo Fragment, e si apre di nuovo dopo come un'ora o giù di lì, il Singleton ha perso tutti i suoi dati, e il Fragment tenta di accedere null campi.

Volevo implementare il metodo onSaveInstanceState, ma sono perplesso su come funziona - non ho alcuna istanza dei dati a cui assegnarlo.

@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? 
} 

Qualsiasi aiuto è benvenuto.

+0

Ma non sono sicuro di capire perché il singleton perderebbe tutti i suoi dati? L'applicazione è ancora in esecuzione in background, non è vero? Io uso lo stesso paradigma nella mia applicazione e non ho visto questa perdita di dati. – Aviral

+0

Sto riscontrando questo problema, quindi credo che lo faccia. – nhaarman

+0

Interessante! Se hai qualche idea su cosa causa la scomparsa dei dati nel singleton, per favore pubblica. Questo mi sta preoccupando. Grazie. – Aviral

risposta

1

I frammenti sono entrambi ospitati nella stessa attività? In tal caso, perché non memorizzare lo stato condiviso in un membro dell'attività e utilizzare l'attività suSaveInstanceState() e onCreate() per salvarlo e ripristinarlo. Nei tuoi frammenti si può quindi fare ...

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

In caso contrario, si potrebbe rendere il vostro oggetto Singleton gestire un oggetto membro che può essere serializzato e deserializzato:

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

Dove

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

Migliore utilizzo Parcable per motivi di prestazioni. – Roel

0

Si potrebbe dare un'occhiata a this. onSaveInstanceState metodo non è molto consigliabile se è necessario trasportare oggetti di grandi dimensioni.

Problemi correlati