2017-02-06 10 views
0

Ich habe ein Fragment, das den Zustand über setRetainInstance(true) speichert. Dies ist sehr vereinfachten Code meines Fragment:Fragment savedInstanceState nicht null nach Aktivität von OS getötet

public class MyFragment extends Fragment { 
    private SomeData mData; 

    public void onCreate(@Nullable Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setRetainInstance(true); 
    } 

    @Override 
    public void onActivityCreated(@Nullable Bundle savedInstanceState) { 
     if (savedInstanceState == null) { 
     mData = new SomeData(getView()); 
     } else { 
     mData.refresh(getView()); 
     } 
     // More awesome code 
    } 
    } 
} 

Manchmal sind die App stürzt mit NullPointerException - mein mData plötzlich wird null. Dies passiert, wenn ich die Anwendung falte und nach einiger Zeit zurückkehre.

Ich habe etwas Theorie. Nach einer Weile tötet OS die Activity und die Fragment (trotz setRetainInstance (true)). Auf diese Weise wird ein neues Objekt meines Fragments erzeugt, wobei mData durch null initialisiert wird. Aber savedInstanseState ist nicht gleich null. Daher überspringt das neue Fragment die Initialisierung und versucht, refresh(View) auf der Nullreferenz aufzurufen.

Meine Frage: Was die savedInstanseState Variable in der onActivityCreated(savedInstanceState) Methode in meinem Schnipsel enthält, wenn OS die Aktivität (wenn App nicht auf dem Bildschirm) töten und neu nach der Rückkehr?

Antwort

0

Nicht sicher über die Antwort vollständig, aber hier ist es, was ich

erraten

setRetainInstance (boolean behalten) Kontrolle, ob ein Fragment Instanz wird über Aktivität Neuschöpfung (wie aus einer Konfigurations Änderung beibehalten). Dies kann nur mit Fragmenten verwendet werden, die nicht im Backstack sind.

So denke ich, dass, wenn Sie die Aktivität die Ansichten falten erhalten zerstört und Instanzdaten (setReetainInstance Wert) im Bundle gespeichert (was savedInstanceState! = Null beim Laden). Wenn Sie jedoch die Aktivität laden (da zuvor die retainInstance auf true festgelegt wurde), wird onCreate() nicht aufgerufen und seit savedInstanceState! = Null und mData == null erhalten Sie den Fehler.

Verwandte Themen