Che cos'è esattamente una situazione di "perdita di stato"? puoi dimostrare uno scenario completo (includi del codice) che lo causerà? Ho letto molti tutorial (ufficiali e non ufficiali), blog, stackoverflow domande/risposte sull'argomento ma mai così un esempio che causerà una reale perdita di stato e che cosa succede dopo che si è verificata la perdita di stato.Perdita di stato del frammento?
Non conosco i passaggi completi da eseguire per causare una perdita di stato. Quello che ho cercato di fare è:
- Un'attività con un layout che contiene un layout di cornice.
- Un frammento che presenta un layout con un testo "Ciao" all'interno di TextView.
- Il frammento viene aggiunto con una transazione di frammento al layout di cornice sopra.
- Uno scenario in cui l'utente preme il pulsante home e quindi si verifica una transazione di frammento che viene eseguita utilizzando il metodo commitAllowingStateLoss().
Poi ho provato a fare un cambio di configurazione ma tutto era ok. Poi ho provato a riprendere dallo sfondo ma anche tutto era ok. Poi ho provato ad aggiungere il frammento allo stack posteriore e fare il commitAllowingStateLoss() e poi i passaggi precedenti, ma quando si verifica la modifica della configurazione o quando sono tornato dallo sfondo, e quindi ho premuto il pulsante Indietro che ha rimosso la transazione, che significa rimuovere il frammento dallo stack posteriore, il che significa che non si verificano perdite di stato.
Quindi cos'è esattamente questa "perdita di stato"? in che modo influisce su ciò che l'utente vedrà sullo schermo. puoi mostrare uno scenario di perdita di stato completo?
EDIT: mettere un po 'codice di prova: il codice
attività:
package com.example.statelosstest;
import android.app.Activity;
import android.app.FragmentTransaction;
import android.os.Bundle;
import android.os.Handler;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
protected void onStop() {
super.onStop();
//Just for test
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
addDummyFragment();
}
}, 5000);
}
/**
* Invoke this method after onSaveInstanceState has been called,
* for example after user press android home button.
*/
private void addDummyFragment(){
DummyFragment frag = new DummyFragment();
FragmentTransaction transaction = getFragmentManager().beginTransaction();
transaction.add(R.id.fragment_frame, frag, frag.getClass().getName());
// tried this also
// transaction.addToBackStack(frag.getClass().getName());
transaction.commitAllowingStateLoss();
}
}
EDIT: ancora nessuna risposta -
ho cercato di simulare le cose che ho pensato che causerà una perdita di stato e che Vedrò quella perdita di stato nell'interfaccia utente ma non potrei simulare o causare alcuna situazione di perdita di stato. Per favore qualcuno può mostrare uno scenario in cui si verifica una perdita di stato e che può essere visto nell'interfaccia utente, il che significa che la perdita di stato si verifica effettivamente quando si verifica un comportamento imprevisto.
Vedi anche: http://www.androiddesignpatterns.com/2013/08/fragment-transaction-commit-state-loss.html –
Ottimo articolo, ma l'ho letto già prima (più di una volta). Non vi è alcun esempio di perdita di stato reale e cosa accade realmente quando si verifica una perdita di stato. Non riesco a immaginare perché è pericoloso usare commitAllowingStateLoss()? Non riesco a immaginare una situazione in cui inciderà davvero sul mio codice. Puoi mostrare un codice e uno scenario che si tradurrà in un comportamento strano dell'interfaccia utente a causa di commitAllowingStateLoss() che ovviamente verrà utilizzato dopo che onSaveInstanceState() è stato chiamato – Elizabeth
@Alex Lockwood sei la mia ultima speranza;) per risolvere questo problema. – Elizabeth